Java - GUI将相同的按钮添加到两个不同的面板

时间:2012-05-15 14:09:26

标签: java user-interface

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在哪里

6 个答案:

答案 0 :(得分:4)

Java GUI组件是分层布局的,每个组件只能有一个父组件。通过将一个Component添加到Container中,任何旧的父引用都将丢失。

答案 1 :(得分: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

    }
}

答案 2 :(得分: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。

如果要包含具有相同功能的按钮,可以将动作侦听器重定向到相同的方法。

但是,必须单独创建按钮。

希望这会有所帮助。

答案 3 :(得分:0)

您无法将相同的组件添加到不同的容器中。只有最新的add才有效。组件只能同时拥有单个父组件。将组件添加到Container时,Container将自动从其上一个父组件中删除该组件(如果存在)。

答案 4 :(得分:0)

可以只将一个组件添加到一个容器中,但是没有什么可以阻止您创建2个不同的按钮并将相同的eventListener附加到它们,以便它们在单击时以相同的方式响应。

答案 5 :(得分:0)

您无法添加相同的按钮,但您可以为按钮添加相同的功能..因此它们可以作为相同的按钮。