0

JButtonフォーカスゲインとロストイベントのサイズを増減したい。JLabel同時に、 focusd のテキストでを変更したいと思いますJButton

テキストを変更していない場合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);
        }
    }
}
4

2 に答える 2

3

問題は、絶対レイアウト (または null レイアウト) と暗黙的な LayoutManager (JPanel にはデフォルトで FlowLayout が付属しています) を混在させていることです。

JLabel で setText を呼び出す (およびそのテキストが変更される) と、自動的に revalidate が呼び出され、最終的に LayoutManager がトリガーされてコンポーネントがレイアウトされます。

LayoutManager を使用するか、オプションでいくつかの制約と優先/最小/最大サイズを設定します (ただし、後者は推奨されません) (また、setLocation/setSize/setBounds を呼び出すことはありません)。または、null-layout を使用して、コンポーネント (この場合、自分自身を setSize/setLocation/setBounds と呼ぶ必要があります)。

LayoutManager チュートリアルを読むことを真剣に検討してください。「レイアウト マネージャーを使用しない場合 (絶対配置) 」に関する専用の章があります。

于 2012-09-17T08:02:58.363 に答える
0

これがあなたが達成しようとしていることだと思います。

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

}
}
于 2012-09-17T08:36:27.490 に答える