Захват экрана в Java не захватывает весь экран

У меня есть небольшой фрагмент кода, который я использую для отслеживания времени - очень просто, он каждые четыре минуты делает снимок моего рабочего стола, чтобы потом я мог вернуться к тому, чем занимался в течение дня - он отлично работает Кроме случаев, когда я подключаюсь к внешнему монитору - этот код снимает только скриншот экрана моего ноутбука, а не внешний монитор большего размера, с которого я работаю, - есть идеи, как изменить код? Я запускаю OSX на тот случай, если это уместно ...

<code>import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;

class ScreenCapture {
    public static void main(String args[]) throws
        AWTException, IOException {
            // capture the whole screen
int i=1000;
            while(true){
i++; 
                BufferedImage screencapture = new Robot().createScreenCapture(
                        new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );

                // Save as JPEG
                File file = new File("screencapture"+i+".jpg");
                ImageIO.write(screencapture, "jpg", file);
try{
Thread.sleep(60*4*1000);
}
catch(Exception e){
e.printStackTrace();
}

            }
        }
}
</code>

Следуя предоставленному решению, я сделал некоторые улучшения, и код, для заинтересованных, находится на рассмотрении кода наhttps://codereview.stackexchange.com/questions/10783/java-screengrab

Ответы на вопрос(2)

Я знаю, что это старый вопрос, но решение, связанное с принятым ответом, не работает, вероятно, на некоторых установках с несколькими мониторами (наверняка на окнах).

If you have your monitors setup this way for example: [3] [1] [2]

Вот правильный код:

public class ScreenshotUtil {

    static public BufferedImage allMonitors() throws AWTException {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] screens = ge.getScreenDevices();
        Rectangle allScreenBounds = new Rectangle();
        for (GraphicsDevice screen : screens) {
            Rectangle screenBounds = screen.getDefaultConfiguration().getBounds();
            allScreenBounds = allScreenBounds.union(screenBounds);
        }
        Robot robot = new Robot();
        return robot.createScreenCapture(allScreenBounds);;
    }
}
Решение Вопроса

Есть учебникСкриншоты мультимонитора Java это показывает, как это сделать. В основном вы должны перебрать все экраны:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screens = ge.getScreenDevices();

for (GraphicsDevice screen : screens) {
 Robot robotForScreen = new Robot(screen);
 ...

Ваш ответ на вопрос