2011-11-04 48 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類應有助於框架可見。雖然我認爲它只適用於框架的「內容窗格」,而不適用於整個框架(帶有標題欄和邊框),除非您使用裝飾框架。