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

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

Javaです。mac osx(tiger)です。
どうしてもセカンダリモニタをキャプチャできません。

Robotの引数なしのコンストラクタを使うとセカンダリモニタが黒くなります。
次に各モニタごとのGraphicsDeviceを指定してやるやりかたでやりますと、キャプチャできることはできるのですが画面の半分だけでへんな乱れ方をした画像がとれます。
僕の環境だけなのか、コードが書き方が悪いのか....

不完全ですがテストコード

package t002;

import java.awt.AWTException;
import java.awt.DisplayMode;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;

import org.jdesktop.swingx.JXImageView;

public class TestCapture {

public static void main(String[] args) throws AWTException {
JXImageView panel = new JXImageView();
JFrame frame = new JFrame();
m(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.setBounds(new Rectangle(100, 100, 300, 300));
frame.setAlwaysOnTop(true);
frame.setVisible(true);
}

public static void m(JXImageView panel) throws AWTException {

GraphicsConfiguration[] graphicsConfigurations = graphicsConfigurations();
for (GraphicsConfiguration graphicsConfiguration : graphicsConfigurations) {
Rectangle rectangle = graphicsConfiguration.getBounds();
System.out.println(rectangle);
// 各graphicsdeviceを使って初期化
Robot robot = new Robot(graphicsConfiguration.getDevice());

System.out.println("disp mode>>>"
+ dispMode(graphicsConfiguration.getDevice()
.getDisplayMode()));
Rectangle cap = new Rectangle(0, 0, rectangle.width,
rectangle.height);
BufferedImage image = robot.createScreenCapture(cap);
panel.setImage(image);
}

}

public static String dispMode(DisplayMode displayMode) {
StringBuilder builder = new StringBuilder();
builder.append(" width:[").append(displayMode.getWidth()).append("] ");
builder.append(" height:[").append(displayMode.getHeight())
.append("] ");
builder.append(" RefreshRate:[").append(displayMode.getRefreshRate())
.append("] ");
return builder.toString();
}

/**
* GraphicsConfigurationを全部取得
* @return
*/
public static GraphicsConfiguration[] graphicsConfigurations() {

List<GraphicsConfiguration> list = new ArrayList<GraphicsConfiguration>();
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();

for (GraphicsDevice graphicsDevice : ge.getScreenDevices()) {
for (GraphicsConfiguration graphicsConfiguration : graphicsDevice
.getConfigurations()) {
list.add(graphicsConfiguration);
}
}
return list.toArray(new GraphicsConfiguration[list.size()]);
}

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

for (GraphicsDevice graphicsDevice : ge.getScreenDevices()) {
for (GraphicsConfiguration graphicsConfiguration : graphicsDevice
.getConfigurations()) {

// unionしている
virtualBounds = virtualBounds.union(graphicsConfiguration
.getBounds());
}
}
return virtualBounds;
}
}

: