【发布时间】:2011-11-04 10:46:28
【问题描述】:
我想将 JFrame 的内容绘制到另一个框架上。目前,我只有在 JFrame 可见时才能使用它。
有没有办法绘制隐藏的 JFrame?
附加信息:
在我的项目中,我需要能够旋转和缩放窗口。我不想编写自己的 window-api,所以我想我可能能够以旋转的方式绘制 JFrame 或类似的容器类(Graphics2D-API 很好地支持)。能够为此使用标准 JFrame 真是太棒了,但是扩展 JFrame 的自定义框架也可以..
public class JFTest extends JFrame {
private JFrame frameToPaint = null;
public static void main (String[] args) {
new JFTest ();
}
public JFTest () {
// some basic initialization
super ("Container");
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setExtendedState (JFrame.MAXIMIZED_BOTH);
add (new JPanel () {
@Override public void paintComponent (Graphics g) {
super.paintComponent (g);
// painting the child frame's contents onto this frame
if (frameToPaint != null) frameToPaint.getRootPane().paintAll (g);
}
});
setVisible (true);
// initializing some test-frame that will get painted onto the container
frameToPaint = new JFrame ("child");
frameToPaint.setSize (200, 100);
frameToPaint.add (new JLabel ("test"));
frameToPaint.addComponentListener (new ComponentAdapter() {
@Override public void componentResized (ComponentEvent e) { repaint (); }
@Override public void componentHidden (ComponentEvent e) { repaint (); }
});
// magic line. an invisible frame will not get painted! why??
frameToPaint.setVisible (true);
}
}
【问题讨论】:
-
我不知道您所说的 “在其他地方绘制一个不可见的 JFrame”是什么意思 [原文如此] 我真的不认为这是解决您的问题。现在:您可以在 Java 中显示完全半透明的窗口但是有一些问题。在 OS X Apple JVM 上,它一直受到支持(即使在旧的 OS X 版本上:肯定可以在 OS X 10.4 上运行)。在 Windows 上,如果我没记错的话,自 JVM 1.6.0_22 以来就有非官方 API(其方法可能会更改/消失)。否则,您可以使用 JNA 在 Windows / OS X / Linux / 等上获得所需的任何透明度。JNA 附带了一个透明度示例。
-
我想获取框架的图形内容,而不必使框架对用户可见。
-
@bit 听起来您希望在复制到帧之前先绘制某种缓冲区。在这种情况下,请查看BufferStrategy 的使用情况。或者通过 GraphicsConfiguration 创建一些 BufferedImage 或 VolatileImage 并在复制之前对其进行绘制。
标签: java swing jframe hidden paint