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在哪里
答案 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)
您无法添加相同的按钮,但您可以为按钮添加相同的功能..因此它们可以作为相同的按钮。