Java 如何复制JPanel?

Java 如何复制JPanel?,java,swing,jpanel,Java,Swing,Jpanel,基本上,我需要复制一个JPanel,例如,如果我们使用Integer变量,这应该可以工作: Integer intaux,int1; int1 = 3; intaux = int1; 但这不适用于面板: jPanelaux = jPanel1; 有没有我不知道的setter方法?正如Kira San所说,您需要为每个要显示的面板提供一个实例 例如: public class MyPanel extends JPanel { //creates a JPanel with the te

基本上,我需要复制一个
JPanel
,例如,如果我们使用
Integer
变量,这应该可以工作:

Integer intaux,int1;
int1 = 3;
intaux = int1;
但这不适用于面板:

jPanelaux = jPanel1;

有没有我不知道的setter方法?

正如Kira San所说,您需要为每个要显示的面板提供一个实例

例如:

public class MyPanel extends JPanel {
    //creates a JPanel with the text "hello"
    public MyPanel() {
        super();
        this.add(new JLabel("Hello"));
    }
}

public class someClass {
    public void someMethod() {
        MyPanel myPanel = new MyPanel();

        //here we add the same instance of MyPanel twice to panel1, which ..
        JPanel panel1 = new JPanel();
        //...adds myPanel
        panel1.add(myPanel);
        //...removes myPanel from the container it was added to first and adds it to this container (which is panel1 in both cases)
        panel1.add(myPanel);

        //here we add two separate instances of MyPanel to panel2, which should both be shown
        JPanel panel2 = new JPanel();
        panel2.add(new MyPanel());
        panel2.add(new MyPanel());
    }
}

如果您只需要原始面板的复制图像,那么创建另一个使用原始JPanel进行绘制的JPanel就可以了

JPanel dup = new JPanel(){
    @Override
    public void paintComponent(Graphics g){
        jPanel1.paintComponent(g);
    }

    @Override
    public Dimension getPreferredSize(){
        return jPanel1.getPreferredSize();
    }
    @Override
    public Dimension getMaximumSize(){
        return jPanel1.getMaximumSize();
    }
    @Override
    public Dimension getMinimumSize(){
        return jPanel1.getMinimumSize();
    }
};

这只会创建原始面板的视图,并且没有一个组件能够正常工作,例如JButton或JTextField不会接收输入。还需要做一些工作来导致重新绘制。

创建自己的JPanel子类,其中包含您想要的所有内容。 比如:

public class MyPanel extends JPanel {

    JButton okButton;
    JButton cancelButton;
    JTextField nameTextField;

    public MyPanel() {
         okButton = new JButton();
         JLabel nameLabel = new JLabel("Name:");

         setLayOut(...);
         add(okButton);
         ...
    }
}
要么使用GUI编辑器,要么复制当前代码中的所有内容


然后您可以使用两个
new MyPanel()
s来拥有相同的复杂组件。

“基本上我需要复制一个JPanel…”为什么?参见
jPanelaux=jPanel1
不创建jpanel的另一个实例,它只提供对同一对象的另一个引用不创建重复的整数实例;它只是创建了对现有int1的另一个引用。可以使用
intaux=newinteger(int1)创建副本“我真的看不出为什么这会被否决。”然后也许你应该避免回答基于Swing的问题。这种方法不适用于添加到原始面板中的文本字段和按钮。它重新创建了原始面板的图像,但没有任何功能。@AndrewThompson原始问题没有说明如何使输入字段和按钮发挥功能。其实什么都没说。我意识到这个解决方案的作用,并在顶部陈述。“它实际上什么都没有说。”这是一个很好的提示,可以请求并等待更多细节。提供半生不熟的解决方案在更大的范围内并没有真正的帮助。你的-1(现在是-2)是应得的。@AndrewThompson你发动了人身攻击,而不是回答问题。“那么也许你应该避免回答基于Swing的问题。”这是不必要的。您声称该方法无效,因为它只是原始面板的图像。这可能无法满足OP的需求,但它可能是“如何复制JPanel?”