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);
}
}输出为:
Java
编程
我所期待的:
Java
Java
编程
为什么? jbt1在p3的什么地方??
发布于 2012-05-15 22:15:17
Java GUI组件是分层布局的,每个组件只能有一个父组件。通过将组件添加到Container中,任何旧的父引用都会丢失。
发布于 2012-05-15 22:20:12
但是你可以:
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-15 22:18:58
调用结构如下
p1.add(jbt1); //jbt1 added to p1
p2.add(jbt2); //jbt2 added to p2
p3.add(jbt1); //jbt1 added to p3 jbt1不再包含在同一个容器中,因此您将获得您提到的输出。它的父类实际上从p1更改为p3。
如果您希望包含具有相同功能的按钮,则可以将操作侦听器重定向到相同的方法。
但是,这些按钮必须单独创建。
希望这能有所帮助。
https://stackoverflow.com/questions/10602564
复制相似问题