画像にマウスカーソルがありません。BufferedImagesにカーソル情報が含まれていないためです。プログラムで追加する必要があります。
そうです、後でカーソルを追加する必要があります。これは、Robotクラスで撮影したスクリーンショットにカーソルが含まれていないためです。「BufferedImageにマウス情報が含まれていない」からではありません。BufferedImageは、ピクセルのラスターを含むクラスです。
スクリーンショットを撮るスレッドはデーモンスレッドです。そのため、アプリケーションを閉じると、スレッドが強制終了され、書き込まれていたPNGイメージが破損します。それは避けたい。
単純に、スクリーンショットスレッドで、続行するかどうかを示すフラグを使用します。そのブール値がtrueに設定されている限り、スクリーンショットを撮り続けます。必ず非デーモンにします。したがって、アプリケーションを閉じるときは、フラグをfalseに設定してください。おそらくこれを行う最も簡単な方法は、WindowListenerを追加することです。
yourFrame.addWindowListener(new WindowAdapter()
{
public void windowClosed(WindowEvent e)
{
screenshotThread.stopTakingScreenshots(); // This methods set the flag
}
}
また、スクリーンショットを作成して保存するのにかかる時間を取っていないことに注意してください。40ミリ秒の固定スリープを使用しますが、スクリーンショットを撮って保存するのに4ミリ秒かかるとすると、36ミリ秒だけスリープする必要があります。スクリーンショットの作成にかかる時間を計るには、メソッドSystem.currentTimeMillis();
の前後を使用takeShot()
して違いを生みます。