gpt4 book ai didi

java - 更改 JButton 的大小和焦点上标签的文本 JButton 的增益和丢失事件

转载 作者:行者123 更新时间:2023-12-02 00:12:29 25 4
gpt4 key购买 nike

我想增加和减少 JButton 的焦点增益和丢失事件的大小。同时,我想用聚焦的 JButton 文本更改 JLabel

如果我不更改 JLabel 文本,我可以更改按钮的大小,但是当我同时更改标签时 JButton 的大小> 不变。

这是代码:

public class Main extends JFrame implements FocusListener {

JButton b1, b2;
JLabel lbl;
private static final long serialVersionUID = 1L;

public Main() {

setSize(600, 600);//Size of JFrame
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);//Sets if its visible.

JPanel panel = new JPanel();

b1 = new JButton("Start");//The JButton name.
b1.setRequestFocusEnabled(false);
b1.addFocusListener(this);
panel.add(b1);

b2 = new JButton("End");//The JButton name.
b2.setRequestFocusEnabled(false);
b2.addFocusListener(this);

panel.add(b2);

add(panel, BorderLayout.CENTER);
lbl = new JLabel(" ");
add(lbl, BorderLayout.SOUTH);
}

public static void main(String[] args) {
new Main();//Reads method main()
}

/*
* What the button does.
*/
@Override
public void focusLost(FocusEvent ae) {

if (ae.getSource() == b2) {
b2.setSize(55, 26);
} else if (ae.getSource() == b1) {
b1.setSize(55, 26);
}
}

@Override
public void focusGained(FocusEvent ae) {

if (ae.getSource() == b2) {
lbl.setText("End");
b2.setSize(55, 40);
} else if (ae.getSource() == b1) {
lbl.setText("Start");
b1.setSize(55, 40);
}
}
}

最佳答案

问题在于您将绝对布局(或空布局)与隐式 LayoutManager 混合在一起(JPanel 默认情况下带有 FlowLayout)。

当您在 JLabel 上调用 setText(并且文本发生更改)时,它会自动调用 revalidate,这最终将触发 LayoutManager 来布局组件。

要么使用 LayoutManager,选择设置一些约束和 pref/min/max 大小(但不推荐后者)(并且您永远不会调用 setLocation/setSize/setBounds),或者使用 null-layout 并设置自己的位置和组件的大小(在这种情况下,您必须调用自己 setSize/setLocation/setBounds)。

认真考虑阅读LayoutManager tutorial 。有一个专门的章节介绍“不使用布局管理器(绝对定位)”。

关于java - 更改 JButton 的大小和焦点上标签的文本 JButton 的增益和丢失事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12454696/

25 4 0