将JPanel内容复制到另一个JPanel而不删除原始JPanel的内容

时间:2014-06-25 10:56:50

标签: java swing jpanel

我是Java swing编码的新手。我正在尝试将JPanel内容复制到一个新的JPanel,它使用原始JPanel的内容来显示。此外,原始JPanel内容随着记录的变化而变化。我尝试了以下代码,但它完全没用。

public void addPanel(JPanel jp)
{
    JPanel jp1=new JPanel();
    int count=jp.getComponentCount()-1;
    for(;i>=0;i--)
    {
         jp1.addComponent(jp.getComponent(i);
    }
    //after this I am setting bounds of jp1.
this.add(jp1);
}

如果我想将多个JPanel作为原始JPanel更改,这不起作用。它会覆盖新的' jp'在' jp1'如果多次使用,比如在for循环中使用。 我不想删除原始JPanel的组件。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

可以移动组件的实例,但是应对它们需要您手动完成。

你可以通过创建原始类的新实例,然后使用getters的值调用setter来执行此程序...但坦率地说,这是一个容易出错的方式,你需要反思它,你除非真的有必要,否则不应该使用。

您可以做的是覆盖您使用的标准Java类(eG JLabel),并在您重写的类中实现Cloneable,您可以在其中设置所需的参数(文本,边界,等等),然后调用您的函数像这样:

public void addPanel(JPanel jp)
{
    JPanel jp1=new JPanel();
    int i=jp.getComponentCount()-1;
    for(;i>=0;i--)
    {
         jp1.addComponent(
              ((Component) // this casts the clone back to component. This is maybe superfluous.
               ((Cloneable)jp.getComponent(i) // You have to ensure that all components that are returned are in fact instances of Cloneable.
               ).clone()
              ));
    }
    //after this I am setting bounds of jp1.
    this.add(jp1);
}

如果你走这条路,请务必阅读Cloneable的文档。

答案 1 :(得分:0)

以下是使用JPanels / JFrames的设计视图解决以下问题而无需编码的方法。

您可以转到设计视图中的导航器选择所有JPanel组件并通过键入 ctrl + a ctrl +来复制它们ç即可。 然后创建另一个JPanel并在设计视图中,只需使用 ctrl + v 粘贴它们。

结果:您可以获得具有相同属性和值的所有组件相同的大小,尺寸和位置。执行此操作后,您可以使用GUI表单的属性轻松更改所需内容。