复制JPanel - (将JPanel的静态图像复制到不同的JPanel)

时间:2014-06-03 07:39:42

标签: java swing clone

我很擅长摇摆,我希望得到一些帮助,因为我坚持完成任务。

当前状态:

我有一个很好的JFrame对象(guiFrame),它上面有两个JPanel(tabsPanel和cardPanel)(一个是带按钮的简单JPanel,另一个是{{{ 1}}由tabsPanel按钮切换)。

问题:

任务是如果我按下按钮"显示"在tabsPanel上我需要将cardPanel作为静态"图像"发送到另一个窗口(ShowFrame),而在上一个窗口中,程序仍然运行且很好。所以基本上我试图复制/克隆cardPanel。

我尝试了什么:

  • 我试过简单地

    CardLayout

    当然不能正常工作,因为正在复制参考编号,如果我运行该程序,则cardPanel"消失"。

  • 我试图使用JPanel jPanelShow = cardPanel; show.add(jPanelShow); 为此它几乎可以工作,但我得到了一些奇怪的clone(),这不是由我的代码引起的。

当前代码(克隆尝试):

CardPanel.java

NullPointerException

CardLayoutExample.java

/**
 * This is basicly a JPanel, just with a clone() implemented
 */
package javaapplication5;

import javax.swing.JPanel;
import java.util.Stack;

public class CardPanel extends JPanel implements Cloneable {

    public CardPanel() {
        super();
    }

    @Override
    public CardPanel clone() throws NullPointerException {
        /* Creating return object */
        final CardPanel copy;

        try {

            /* Cloning */
            copy = (CardPanel) super.clone();
        } catch (CloneNotSupportedException e) {

            /* Exception (should not happen though) */
            e.printStackTrace();
            return null;
        }
        return copy;
    }
}

TestContent,TestContent1和TestContent2是由SwingGUI生成的随机内容的简单JPanel,就像ShowFrame是空的JFrame一样。但如果需要,我也会粘贴这些代码。

1 个答案:

答案 0 :(得分:2)

如果您只需要cardPanel的“图片”,则可以创建图片并使用JLabel来显示,例如......

BufferedImage img = new BufferedImage(cardPanel.getWidth(), cardPane.getHeight(), BufferedImage.BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
cardPanel.printAll(g2d);
g2d.dispose();

现在您拥有cardPanel的“副本”,您可以使用JLabel来显示它,例如......

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.DIPOSE_ON_CLOSE);
frame.add(new JLabel(new ImageIcon(img)));
frame.pack();
frame.setLocationRelativeTo(this);
frame.setVisible(true);