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

Java 将JPanel内容复制到另一个JPanel而不删除原始JPanel的内容,java,swing,jpanel,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.a

我不熟悉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更改,那么这不起作用。如果多次使用,例如在for循环中使用,它会将新“jp”的内容覆盖到“jp1”上。
我不想删除原始JPanel的组件。我如何才能做到这一点?

移动组件实例是可能的,但处理它们需要手动进行

作为一个程序,您可以创建origin类的新实例,然后使用getter的值调用setter。。。但坦率地说,这是一种容易出错的方法,你需要对它进行反思,除非真的有必要,否则你不应该使用它

您可以做的是重写您使用的标准Java类(例如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);
}

如果您沿着这条路走下去,请务必阅读的文档。

以下是解决以下问题的方法,无需仅使用JPanels/JFrames的设计视图进行编码

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


结果:所有零部件的尺寸、尺寸和位置都相同,且具有相同的特性和值。完成此操作后,您可以通过使用GUI表单的属性轻松地更改任何内容。

“我正在尝试将JPanel内容复制到一个新的JPanel,它使用原始JPanel的内容来显示。”…为什么?请注意,组件只能添加到一个父级(并且可以看到)。这就是它不起作用的原因。这些组件的
getParent()
方法会返回什么?或者
getRootPane()
?哪些父项将设置组件的宽度和高度(当然,存储在其中)?JComponents从来就不应该被共享,如果你想复制-复制,不要共享。不要复制视图组件,例如
JComponent
;更新组件的模型,例如
label.setText()
。感谢Angelo提供的解决方案!因为有人建议任何swing组件只有一个父级,所以我采用了不同的方法来解决这个问题。我使用您的代码尝试了一个示例应用程序,它成功了@mapp_301092谢谢。如果这个答案对你有帮助,请勾选左边的“接受”钩,或者更好,提供你自己的答案,详细说明你最终是如何解决问题的,以便为未来的读者服务。