2016-09-07 11 views
0

Canvasを含むJavaFXの透明なStageを使用しています。ロボットを使用したJavaFXキャプチャ画面

ユーザーは、マウスをドラッグしてキャンバスにrectangleを描くことができます。私が使用しています

try { 
    ImageIO.write(bufferedImage,extension,outputFile); 
} catch (IOException e) { 
    e.printStackTrace();       
} 

を画面からimageをキャプチャするには:

gc.clearRect(0, 0, getWidth(), getHeight()); // [gc] is the graphicsContext2D of the Canvas 

     // Start the Thread 
     new Thread(() -> { 
      try { 

       // Sleep some time 
       Thread.sleep(100); 

       // Capture the Image 
       BufferedImage image; 
       int[] rect = calculateRect(); 
       try { 
        image = new Robot().createScreenCapture(new Rectangle(rect[0], rect[1], rect[2], rect[3])); 
       } catch (AWTException e) { 
        e.printStackTrace(); 
        return; 
       } 

      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     }).start(); 

彼はを打つ私が使用して画像を保存していを入力します。

問題

JavaFX Threadはscreen.Butそれをので、私はあなたがそれを超えると100ミリ秒を待っている見ることができるようにThreadを使用していますCanvasをクリアしてからキャプチャしますとき、私は知りませんすべての時間を働いていない、私は何を意味することは、時にはCanvasがクリアされていないと私は(原因Canvasがまだクリアされていない)、この画像を取得することです:

enter image description here

これに代え

enter image description here

質問:JavaFXCanvasはので、私はその後の画面をキャプチャすることができますクリアしたとき、私は知っているどのように

それは、私は、Javaで画面をキャプチャするために知っている唯一の方法ですが、JavaFXSwingをミキシングが推奨されていません...

答えて

1

私は本当にあなたがこれ以上望むものを達成するためのより良い方法があります願っていますが、キャンバスになります次に "パルス"がレンダリングされるときにクリアされます。だから、一つのアプローチは、AnimationTimerを開始し、第二のフレームがレンダリングされるまで待つことになります:

明らか
gc.clearRect(0, 0, getWidth(), getHeight()); 
AnimationTimer waitForFrameRender = new AnimationTimer() { 
    private int frameCount = 0 ; 
    @Override 
    public void handle(long timestamp) { 
     frameCount++ ; 
     if (frameCount >= 2) { 
      stop(); 
      // now do screen capture... 
     } 
    } 
}; 
waitForFrameRender.start(); 

、あなたがバックグラウンドスレッドで画面キャプチャを行っている場合、あなたはまた、あなたが描画しないようにする必要がありキャプチャが行われる前にキャンバスに戻ってください...

+0

「パルス」とは何ですか、「パルス」が2度目にレンダリングされることを知っていますか?JavaFXでのロボット実装のインポートに関する計画?最後にあなたが良いアイデアを持っているなら、聞くのがいいでしょう!答えをありがとう... – GOXR3PLUS

+0

テストを通じて、それは全体の画面または大きな領域を選択する小さな矩形のためにのみ動作します。キャンバスがクリアされていない無効なイメージを持っています.. – GOXR3PLUS

+1

パルスは毎秒60のターゲットレートで生成されますFXツールキット(FXアプリケーションスレッドが行う必要がある作業が長すぎる場合、頻繁に発生する頻度は低いです)。各パルス上で、UI「フレーム」がレンダリングされる。再描画が必要なUIの部分が再描画されます。 'AnimationTimer.handle(...)'はフレームごとに一度呼び出されることが保証されています。したがって、 'handle()'が2回呼び出されるまで待って、 'clearRect()'を呼び出してから、少なくとも1つの完全なフレームがレンダリングされるまで待つことです。なぜそれが大きなキャンバスのために働いていないのか分かりません... –

関連する問題