简体   繁体   English

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

[英]Change size of JButton and text of a label on focus Gain and lost event of JButton

I want to increase and decrease the size of JButton on its focus gain and lost event. 我想增加和减小JButton的焦点增益和丢失事件的大小。 Simultaneously I want to change the JLabel with the text of focussed JButton . 同时,我想用聚焦JButton的文本更改JLabel

If I'm not changing the JLabel text, I'm able to change the size of buttons, but when I'm changing the label simultaneously the size of JButton does not change. 如果不更改JLabel文本,则可以更改按钮的大小,但是同时更改标签时, JButton的大小不会更改。

Here is the code: 这是代码:

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);
        }
    }
}

The problem is that you are mixing absolute-layout (or null-layout) with an implicit LayoutManager (JPanel comes with a FlowLayout by default). 问题是您将绝对布局(或null布局)与隐式LayoutManager(默认情况下,JPanel随附FlowLayout)混合在一起。

When you call setText on a JLabel (and that text changes), it automatically calls revalidate which will eventually trigger the LayoutManager to lay out the components. 当您在JLabel上调用setText时(该文本发生更改),它将自动调用revalidate,最终将触发LayoutManager对组件进行布局。

Either use a LayoutManager, optionally set some constraints and pref/min/max size (but the latter is not recommended) (and you never call setLocation/setSize/setBounds), or use null-layout and set yourself the location and size of the components (and in this case you must call yourself setSize/setLocation/setBounds). 要么使用LayoutManager,或者选择设置一些约束和首选项/最小/最大大小(但不建议使用后者)(并且您永远不要调用setLocation / setSize / setBounds),或者使用null-layout并设置自己的位置和大小组件(在这种情况下,您必须自称setSize / setLocation / setBounds)。

Seriously consider reading the LayoutManager tutorial . 认真考虑阅读LayoutManager教程 There is a dedicated chapter on " Doing Without a Layout Manager (Absolute Positioning) ". 有专门的章节“ 不使用布局管理器(绝对定位) ”。

I think this is what you are trying to achieve. 我认为这是您要实现的目标。

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();
    panel.setLayout(null);
    panel.setSize(this.getSize());
    b1 = new JButton("Start");// The JButton name.
    b1.setRequestFocusEnabled(false);
    b1.addFocusListener(this);
    b1.setLocation(10, 12);
    panel.add(b1);

    b2 = new JButton("End");// The JButton name.
    b2.setRequestFocusEnabled(false);
    b2.addFocusListener(this);
    b2.setLocation(70, 12);
    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);
    }

}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM