1
public class Test extends JFrame {
    public Test() {
        JButton jbt1 = new JButton("Java");
        JButton jbt2 = new JButton("Programming");
        JPanel p1 = new JPanel();
        JPanel p2 = new JPanel();
        JPanel p3 = new JPanel();
        p1.add(jbt1);
        p2.add(jbt2);
        p3.add(jbt1);

        add(p1, BorderLayout.NORTH);
        add(p2, BorderLayout.SOUTH);
        add(p3, BorderLayout.CENTER);
    }
    public void main(String[] args) {
        Test f = new Test();
        f.setVisible(true);
    }
}

出力は次のとおりです。

ジャワ

プログラミング

私が期待していること:

ジャワ

ジャワ

プログラミング

なぜ?????????p3のjbt1はどこですか??

4

6 に答える 6

4

Java GUI コンポーネントは階層的に配置され、各コンポーネントは 1 つの親しか持つことができません。コンポーネントをコンテナに追加すると、古い親参照は失われます。

于 2012-05-15T14:15:17.113 に答える
2

でも君ならできる:

public static void main(String[] args) {

    Action javaAction = new JavaAction();

    JPanel p1 = new JPanel();
    JPanel p3 = new JPanel();
    p1.add(new JButton(javaAction));
    p3.add(new JButton(javaAction));
}

private static final class JavaAction extends AbstractAction {

    JavaAction() {
        super("Java");
    }

    public void actionPerformed(ActionEvent e) {

        // put your code here

    }
}
于 2012-05-15T14:20:11.897 に答える
1

呼び出し構造は次のとおりです。

    p1.add(jbt1); //jbt1 added to p1
    p2.add(jbt2); //jbt2 added to p2
    p3.add(jbt1);  //jbt1 added to p3 

jbt1 は同じコンテナーに含まれなくなったため、前述の出力が得られます。その親は実際には p1 から p3 に変更されます。

同じ機能を持つボタンを含めることを検討している場合は、アクション リスナーを同じメソッドにリダイレクトできます。

ただし、ボタンは個別に作成する必要があります。

お役に立てれば。

于 2012-05-15T14:18:57.857 に答える
0

同じコンポーネントを異なるコンテナーに追加することはできません。最新のものだけaddが機能します。コンポーネントは、同時に 1 つの親のみを持つことができます。コンポーネントをコンテナに追加すると、コンテナは以前の親からコンポーネントを自動的に削除します (存在する場合)。

于 2012-05-15T14:13:56.190 に答える
0

同じボタンを追加することはできませんが、ボタンに同じ機能を追加することはできます..同じボタンとして機能します。

于 2016-08-06T09:52:29.273 に答える
0

コンポーネントを 1 つのコンテナーにのみ追加することは可能ですが、2 つの異なるボタンを作成し、同じ eventListener をそれらにアタッチして、クリックしたときに同じように応答することを妨げるものは何もありません。

于 2012-05-15T14:18:14.503 に答える