0

にデプロイされたボタンを押すことによって実行されるアクション (つまりメソッド) でJFrame、Java アプリを非表示にしてからスクリーンショットを取得したいと考えています。最後に、スクリーンショットを撮ったら、それをJFrame見えるようにする必要があります。

方法は次のとおりです。

  public void myButtonPressedAction(){
       //Hiding the JFrame
       this.setVisible(false);
       //Now I use Robot to get a screenshot using another method
       //not reported for simplicity
       myMethodToGetScreenshot();
       //Making the JFrame visible
       this.setVisible(true);
  }

可視性が false に設定されると、アプリが非表示になり始め、すぐにスクリーンショットが取得されます。残念ながら、スクリーンショットはJFrameフェードアウト中もキャプチャします (つまり、非表示になり、isVisibleメソッドは を返しますtrueが、はJFrame完全に見えないわけではありません)。

考えられる解決策の 1 つは、タイマーを挿入して への呼び出しと への呼び出しの間に遅延を置くsetVisible(false)ことmyMethodToGetScreenshot()です。ただし、システムがビジーであると仮定すると、遅延は過小評価される可能性があります。逆に、遅延が大きいとアプリケーションが遅くなります。

JFrameが完全にフェードアウトする、つまり実際に見えなくなる正確な時刻を取得するにはどうすればよいですか?

編集

これはコンストラクターで初期化されます。

String myPath= ...;//here I have a String that represent a path to a folder.
JPEGImageWriteParam JPEG_PARAMS_BEST_QUALITY = new JPEGImageWriteParam(null);
JPEG_PARAMS_BEST_QUALITY.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
JPEG_PARAMS_BEST_QUALITY.setCompressionQuality(1f);

これはのコードです myMethodToGetScreenshot()

public void  myMethodToGetScreenshot(){
  BufferedImage capture = new Robot().createScreenCapture(screenArea);
  ImageWriter writer = writerService.getWriter();
  writer.setOutput(new FileImageOutputStream(new File(myPath+"screenshot.jpg")));
  writer.write(null, new IIOImage(capture, null, null), JPEG_PARAMS_BEST_QUALITY);
}

これは私が得るスクリーンショットです。JFrame がフェードアウトしているのがわかります...

ここに画像の説明を入力

4

4 に答える 4

2

代わりにsetvisible使用できますsetExtendedState

//Minimize the JFrame
this.setExtendedState(JFrame.ICONIFIED);
//Now I use Robot to get a screenshot using another method
//not reported for simplicity
myMethodToGetScreenshot();
//Restore the JFrame
this.setExtendedState(JFrame.NORMAL);
于 2013-06-19T09:48:28.013 に答える
1

フレームを非表示にした後、スクリーンショットを撮る前に、妥当な遅延を追加する必要があります。robot.delay()最も簡単な方法は、 beforeへの呼び出しを挿入することrobot.createScreenCapture()です。

于 2013-06-19T10:10:08.813 に答える
0

ComponentListenerを試してみます (このコードが JFrame 拡張クラスのメンバーに渡されると仮定します)。

    final Container contentPane = getContentPane();
    ComponentAdapter componentAdapter = new ComponentAdapter() {

        @Override
        public void componentHidden(ComponentEvent arg0) {
            myMethodToGetScreenshot();
            contentPane.removeComponentListener(this);
        }
    };
    contentPane.addComponentListener(componentAdapter);
于 2013-06-19T10:09:11.977 に答える