2011-11-04 18 views
1

我想绘制一个JFrame的内容到另一个框架。目前,如果JFrame可见,我只会让它工作。
有没有办法绘制隐藏的JFrame?如何在其他地方绘制隐形JFrame?

附加信息:
在我的项目中,我需要能够旋转和缩放窗口。我不想写自己的window-api,所以我想我可能只是以旋转的方式绘制JFrame或类似的容器类(Graphics2D-API支持得非常好)。这将是真棒,以便能够使用标准JFrames了,只延长一个JFrame定制的框架也将是OK ..

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); 
    } 
}
+0

我不知道你是什么意思*“在别处画一个隐形的JFrame”* [原文如此]我真的*不认为这是你的问题的解决方案。现在:你*可以*在Java中显示完全透明的窗口**,但是**有陷阱。在OS X Apple JVM上,它始终得到支持(即使在旧的OS X版本中:肯定可以在OS X 10.4上运行)。在Windows上,如果我没有弄错的话,有非官方的API(其方法可能会改变/消失),因为JVM 1.6.0_22。否则,您可以使用JNA在Windows/OS X/Linux /等上获得您想要的任何级别的透明度。JNA附带了一个透明度示例。 – TacticalCoder

+0

我想获得一个框架的图形内容,而不必让框架对用户可见。 – bit

+0

@bit这听起来像你想复制到一个框架之前的某种缓冲区绘制。在这种情况下,请查看[BufferStrategy]的用法(http://download.oracle.com/javase/7/docs/api/java/awt/image/BufferStrategy.html)。或者通过GraphicsConfiguration创建一些BufferedImage或[VolatileImage](http://download.oracle.com/javase/7/docs/api/java/awt/image/VolatileImage.html)并在复制之前对其进行绘制。 –

回答

1

1),你必须使用正确的LayoutManager,不setSize()setBounds()

2)如果有则使用任何尺寸Container返回null LayoutManagersetVisible(true);

3)如果是有适当使用LayoutManager,然后Container返回其Size呼叫后,在其他手这个容器不能在屏幕上(意为setVisible(true);)上可见

4)JComponents一定要返回PrefferedSize为example

2

提示1:Jframe的setDefaultLookAndFeelDecorated(假)/ setUndecorated(真)可能适用于没有标题和边界的窗口;

提示2:因为setGlassPane/setLayeredPane/setOpaque(false)可能用于第二个“图层”。

2

我希望得到一个帧的图形内容,而不必让用户

Screen Image类应有助于框架可见。虽然我认为它只适用于框架的“内容窗格”,而不适用于整个框架(带有标题栏和边框),除非您使用装饰框架。