2011-11-04 11 views
1

JFrameの内容を別のフレームにペイントしたいと思います。現在、JFrameが表示されている場合にのみ動作します。
隠しJFrameをペイントする方法はありますか?目に見えないJFrameを他の場所にペイントする方法は?

追加情報:
私のプロジェクトでは、ウィンドウの回転と拡大縮小が可能である必要があります。私は独自のwindow-apiを書いたくないので、JFramesや同様のコンテナクラスを(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では、私が間違っていない場合、JVM 1.6.0_22以降の公式でないAPI(メソッドが変更/消滅する可能性があります)があります。それ以外の場合は、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)場合は、null LayoutManagerContainer次に使用戻り任意のサイズは、適切LayoutManagerが使用される場合、次いでContainerコール後にSizeを返す)setVisible(true);

3の後に存在しますJFrameののsetDefaultLookAndFeelDecorated(偽)/ setUndecorated(真)かもしれません:、他の手の中に、このコンテナが

4(setVisible(true);を意味する)、画面上に表示することができませんでした)JComponentのはexample

2

ヒント1用PrefferedSizeを返すために必要がありますキャプションや枠線のないウィンドウで使用する。

ヒント2:setGlassPane/setLayeredPane/setOpaque(false)は、2番目の「レイヤー」として使用できます。

2

私はScreen Imageクラスは助けるべき

ユーザーのためのフレームを見えるようにすることなく、フレームのグラフィカルな内容を取得したいです。私はそれが装飾されたフレームを使用しない限り、フレームの "コンテンツペイン"でのみ動作し、フレーム全体(タイトルバーと枠線では)では動作しないと思います。

関連する問題