2016-08-09 3 views
2

Javaで「ロボット」を使用するために、画面の領域のスクリーンショットを撮る必要があります。しかし、ユーザーがウィンドウをその領域に配置すると、ウィンドウはバックグラウンドではなくスクリーンショットに表示されます。Javaで画面上にフレームが表示されなくなった場合にのみアクションを実行する方法はありますか?

私は置くことによって、私の問題を解決しようとした:

myframe.setVisible(false); 

しかし、私は窓がそれに表示されるスクリーンショットを見たとき。私は窓がまだ更新されていなかった画面のレンダリングためか、消えるのに十分な時間を持っていなかったので、それはだと思ったので、私は使用してのような別のものを試してみました:

repaint(); 

するか、

を配置することによって、
try{}finally{} 

ブロックtryブロック内のアクションが完了していることを確認します。 しかし、これらのソリューションのどれも動作しません。これらは私の心の中の他の方法ですが、彼らは待つために関数を使用するので、世界的に悪いと思われます。

私の問題は良い解決策ですか?

+0

[MCVE] – STaefi

+0

をより早く、より早く得るには、Javaでスクリーンキャプチャをしようとしていますか? – aurelianr

+0

いいえ、私はちょうどフレームが消えてしまったときにスクリーンショットを撮りたい、フレームを見えなくしようとしているときにスクリーンショットを撮っています。 – Firetiger72

答えて

0

SwingUtilities.invokeLater()を使用して実際のスクリーンショットを撮ります。 100%ではありませんが、myframe.setVisible(false);は、プログラムの流れがイベントディスパッチループに戻るまで有効にならないと思います。

EDIT: の代わり

useRobotToMakeScreenshot(); 

書き込み

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      useRobotToMakeScreenshot(); 
     } 
    } 

(もちろん、あなたがscreenshootingのことを行う方法への実際の呼び出しでuseRobotToMakeScreenshot()を交換する必要が)

+0

もっと正確に言えば、私はあなたの答えを非常に理解しておらず、それは私が探しているものだと思われます... – Firetiger72

+0

@ Firetiger72は私の拡大答えを見て、 –

1

ウィンドウリスナーを使用すると、ウィンドウが閉じているときにスクリーンショットを発生させることができます。

import java.awt.event.WindowEvent; 
import java.awt.event.WindowListener; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class MainFrame extends JFrame implements WindowListener { 

    public MainFrame() { 

     super("Test Frame"); 
     JLabel displayMsg = new JLabel(" Close window"); 
     getContentPane().add(displayMsg); 

     addWindowListener(this); 
     setSize(400, 300); 
     setVisible(true); 

    } 

    @Override 
    public void windowClosing(WindowEvent e) { 

     System.out.println("WindowListener method called: windowClosing."); 
     //add you screen capture code here 
    } 

    //--Not used 

    @Override 
    public void windowClosed(WindowEvent e) { 
     //do nothing 
    } 

    @Override 
    public void windowOpened(WindowEvent e) { 
     //do nothing 
    } 

    @Override 
    public void windowIconified(WindowEvent e) { 
     //do nothing 
    } 

    @Override 
    public void windowDeiconified(WindowEvent e) { 
     //do nothing 
    } 

    @Override 
    public void windowActivated(WindowEvent e) { 
     //do nothing 
    } 

    @Override 
    public void windowDeactivated(WindowEvent e) { 
     //do nothing 
    } 

    public void windowGainedFocus(WindowEvent e) { 
     //do nothing 
    } 

    public void windowLostFocus(WindowEvent e) { 
     //do nothing 
    } 

    public static void main(String[] args) { 
     new MainFrame(); 
    } 
} 
関連する問題