将JPanel添加到多个JFrame

时间:2013-11-26 19:08:57

标签: java swing jframe jpanel

我有一个包含大量上下文的JPanel。

我希望能够将所述JPanel添加到两个JFrame中。有什么提示吗?

这是我想要的例子

public class Test
{
    public static void main(String [] args)
    {
        JPanel panel = new JPanel();
        panel.add(new JLabel("Hello world"));
        panel.validate();

        JFrame frame1, frame2;
        frame1 = new JFrame("One");
        frame2 = new JFrame("Two");
        frame1.add(panel);
        frame2.add(panel);
        frame1.validate();
        frame2.validate();
        frame1.setVisible(true);
        frame2.setVisible(true);
        frame1.pack();
        frame2.pack();
    }
}

我希望两个JFrame都显示hello world,而不是一个显示它而另一个显示为空。如果JPanel更新中的数据,我希望两个JFrame都显示它。

感谢任何人的帮助,这一直困扰着我。

3 个答案:

答案 0 :(得分:6)

我认为你不能。当java.awt.Container添加Component时,JFrame中的代码会包含此消息。在这里,请阅读Container的{​​{1}}和JPanel的{​​{1}}:

comp

(那是 /* Reparent the component and tidy up the tree's state. */ if (comp.parent != null) { comp.parent.remove(comp); if (index > component.size()) { throw new IllegalArgumentException("illegal component position"); } }

就在那里,当您将其添加到其他java.awt.Container.addImpl(Component, Object, int)时,会将其从旧版Container中删除。我想你可以重写这个基本级别的AWT代码,但我不推荐它。

答案 1 :(得分:1)

所有Swing组件只能有一个父组件,这意味着如果您将组件添加到另一个容器,它将自动从第一个容器中删除...

尝试类似......

    JPanel panel = new JPanel();
    panel.add(new JLabel("Hello world"));

    JFrame frame1, frame2;
    frame1 = new JFrame("One");
    frame1.add(panel);
    frame1.pack();
    frame1.setVisible(true);

    JPanel panel2 = new JPanel();
    panel2.add(new JLabel("Hello world"));
    frame2 = new JFrame("Two");
    frame2.add(panel2);
    frame2.pack();
    frame2.setVisible(true);

相反

答案 2 :(得分:1)

听起来你想要同一个东西的两个视图,因为它不适用于两个帧上的一个JPanels,你是否考虑创建两个面板,每个面板都引用了这个你希望在每个面板中查看的东西从而规避这个问题?

粗略的想法概述如下。基本上你不需要两个单独的JPanel来反映彼此,你需要两个反映其他东西的JPanel。

class Data<T> {
.....stuff
  void update();
  T getdata();
}

class DataView<T> extends JPanel {
  private Data<T> data;
  ...stuff
  public DataView(T data) {
     this.data = data;
  }
  ...stuff
  protected void paintComponent(Graphics g) {
     drawData();
     ...stuff
  }
}

然后

public static void main(String[] args ) {
  Data<String> data = new Data();
  DataView<String> dataViewOne = new DataView(data);
  DataView<String> dataViewTwo = new DataView(data);
  ..add to two seperate frames, pack set visible etc..
}