プログラマメモ2 - programmer no memo2

osx(Tiger) java5でのjava.awt.RobotのcreateScreenCaptureについて 2008/08/23

Javaです。mac osx(Tiger)上でJava5の環境です。

スクリーンキャプチャができるjava.awt.RobotのcreateScreenCaptureを不可解な例外が発生。

Exception in thread "main" java.lang.NegativeArraySizeException
at apple.awt.CRobot.getRGBPixels(CRobot.java:197)
at java.awt.Robot.createScreenCapture(Robot.java:298)


使ってモニターがふたつの状態でおきました。
Windows環境では、同じコードで画面をまたがってキャプチャできたのですがmac osxでのAppleのJavaでは上記の例外が。

テストコード
package t002;

import java.awt.AWTException;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;

public class TestRobotCapture {

public static void main(String[] args) throws AWTException {
final Robot robot = new Robot();

final Rectangle virtualBounds = virtualBounds();
// System.out.println(virtualBounds);
// x
for (int i = 0; i < virtualBounds.width; i++) {
// y
for (int j = 0; j < virtualBounds.height; j++) {
Rectangle rectangle = new Rectangle(i, j, 1, 1);
System.out.println(rectangle);
robot.createScreenCapture(rectangle);
}
}
}

static Rectangle virtualBounds() {
Rectangle virtualBounds = new Rectangle();
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();

for (GraphicsDevice graphicsDevice : ge.getScreenDevices()) {
for (GraphicsConfiguration graphicsConfiguration : graphicsDevice
.getConfigurations()) {
virtualBounds = virtualBounds.union(graphicsConfiguration
.getBounds());
}
}
return virtualBounds;
}
}


どうも左にプライマリディスプレイ、右にセカンダリのディスプレイがある環境です。
左のモニタのサイズをこえたところで例外が発生。

まだ実験していませんが、Robotには GraphicsDeviceを指定できるコンストラクタが用意されています。
これは、モニタ毎に指定してあげればいいのかもしれません。

: