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);
}
}
私はあなたが何を意味するのか分かりません。*「目に見えない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
フレームのグラフィックコンテンツを取得したいのですが、そのフレームをユーザーに見えるようにする必要はありません。 – bit
@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)を作成し、コピーしてからコピーしてください。 –