将JPanel添加到多个JFrames

5

我有一个包含许多内容的JPanel。

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

以下是我想要的示例:

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();
    }
}

我希望两个JFrames都显示“hello world”,而不是一个显示它而另一个为空。如果JPanel中的数据更新,我希望两个JFrames都能显示它。
谢谢大家的帮助,这个问题困扰了我一段时间。
3个回答

6

我认为你做不到。当你向java.awt.Container添加一个Component时,其中的代码包含以下提示。在此处,将JFrame替换为Container,将JPanel替换为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时,它会从旧的Container中删除。我想你可以重写这个基本的AWT代码,但我不建议这样做。


谢谢 :) 我非常希望这是可能的,但我猜不是 :( - Quillion

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);

相反


1
听起来你想要同一事物的两个视图,因为在两个框架上使用一个JPanel不起作用,你有没有考虑创建两个面板,每个面板都有对此事物的引用,从而规避这个问题?
大致想法如下所示。实际上,你不需要两个单独的JPanels来反映彼此,你需要反映其他东西的两个JPanels。
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..
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接