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 组件是分层布局的,每个组件只能有一个父级。通过将组件添加到容器中,任何旧的父引用都会丢失。

于 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才能工作。一个组件只能同时有一个父级。当您将组件添加到 Container 时,Container 将自动从其先前的父级中删除该组件(如果存在)。

于 2012-05-15T14:13:56.190 回答
0

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

于 2012-05-15T14:18:14.503 回答
0

您不能添加相同的按钮,但您可以为按钮添加相同的功能..因此它们充当相同的按钮。

于 2016-08-06T09:52:29.273 回答