É, realmente esse método não funciona do jeito que esperava.
Mas fiz outro teste que funcionou, utilizando também o método que silveta enviou, além de uns outros “truques”. 
Depois roda na sua máquina pra testar!
[]s
[code]package br.com.teste;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
public class CopyWindowContents {
private JFrame window;
JPanel mainPanel;
private SortedMap<String, Component> components;
private Map<String, MouseListener> listeners;
public CopyWindowContents() {
window = new JFrame("Janela");
components = new TreeMap<String, Component>();
listeners = new HashMap<String, MouseListener>();
mainPanel = new JPanel();
components.put("component", new JLabel("Esse texto vai ser copiado"));
components.put("button", new JButton("Copiar"));
for (Component component : components.values()) {
mainPanel.add(component);
}
mainPanel.setLayout(new GridLayout(2, 2));
window.setContentPane(mainPanel);
listeners.put("buttonListener", new MouseAdapter() {
private int currentCopy = 1;
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
int iWidth = mainPanel.getPreferredSize().width;
int iHeight = mainPanel.getPreferredSize().height;
Image bi = getPanelCopy(iWidth, iHeight);
JLabel copyComponent = new JLabel(new ImageIcon(applyScale(bi,iWidth/2,iHeight/2,Image.SCALE_SMOOTH)));
copyComponent.setBorder(new BevelBorder(BevelBorder.RAISED));
components.put("newCopy"+currentCopy, copyComponent);
mainPanel.add(copyComponent);
currentCopy++;
mainPanel.repaint();
window.pack();
}
});
components.get("button").addMouseListener(
listeners.get("buttonListener"));
window.setBounds(100, 100, 200, 500);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.pack();
window.setVisible(true);
}
public Image getPanelCopy(int iWidth, int iHeight){
BufferedImage bi = new BufferedImage(iWidth, iHeight,
BufferedImage.TYPE_INT_RGB);
mainPanel.paint(bi.getGraphics());
return bi;
}
public static Image applyScale(final Image img, final int width,
final int height, final int hint) {
final int proportionalWidth;
final int proportionalHeight;
img.getHeight(null);
final double containerRate = height / (double) width;
final double imgRate = img.getHeight(null)
/ (double) img.getHeight(null);
if (imgRate > containerRate) {
proportionalWidth = -1;
proportionalHeight = height;
} else {
proportionalWidth = width;
proportionalHeight = -1;
}
return img.getScaledInstance(proportionalWidth,
proportionalHeight, hint);
}
public static void main(String[] args) {
new CopyWindowContents();
}
}
[/code]