2012-07-14 41 views
4

实施例:为什么添加多次后无法显示同一个JComponent对象?

public class JFrameTest { 
    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame frame = new JFrame(); 
      JButton button = new JButton("Hello!"); 
      frame.getContentPane().add(button); 
      frame.getContentPane().add(button); 
      frame.pack(); 
      frame.setVisible(true); 
      frame.setLocationRelativeTo(null); 
     } 
    }); 
    } 
} 

在上述例子中的“按钮”对象仅添加即使没有错误一次。我问这个问题的原因是,我想在JFrame和JDialog上添加一个相同的JPanel对象(在某些表上双击编辑/删除功能)。我可以通过使用两个JPanel对象来解决它,但只是想知道为什么它不可能。

+2

简单的答案是,你不能,因为javadocs说你不能。 – 2012-07-14 07:01:07

+3

“作为惯例,add和它的变体......已被覆盖,以便根据需要转发到contentPane。这意味着您可以编写:''frame.add(button)' - ['JFrame'](http:///docs.oracle.com/javase/7/docs/api/javax/swing/JFrame.html)。 – trashgod 2012-07-14 08:15:51

回答

6

您只能在Swing层次结构中添加一次Swing组件,因为您已经发现了这些组件。这被记录在'Using top-level components tutorial'

每个GUI组件只能被包含一次。如果一个组件已经在一个容器中,并且您尝试将其添加到另一个容器中,则组件将从第一个容器中移除,然后添加到第二个容器中。

不能完全确定是否有技术上的限制,让这个决定,但我可以想像,例如getParent方法会给奇怪的结果,如果你能够在同一组件添加两个Container小号

+3

“技术限制”很可能是组件的字段保存组件的计算大小和组件相对于其父项和/​​或其窗口的位置。如果一个组件可以不止一次地位于一个容器(或多个容器)中,那么这些字段不能保存两组位置/大小的相关信息。 – 2012-07-14 07:00:22

+1

@StephenC这肯定是一种可能性。我也在考虑事件处理问题(如'mouseEntered')并将事件传递到组件链上 – Robin 2012-07-14 12:13:30

+0

任何与一个对象相关的事物都会导致冲突,无论是大小,位置/事件处理,颜色,字体,等等等等。你的名字和这件事将会引发冲突,指出哪一个是指哪一个:-) – 2012-07-14 16:07:21

相关问题