アプリケーションでスクリーンショットを撮り、印刷ダイアログを表示して、ユーザーがスクリーンショットを印刷できるようにしたいと考えています。ただし、スクリーンショットの取得が遅すぎる/ダイアログの表示が速すぎるため、ダイアログがスクリーンショットに表示されます (以下を参照)。
BufferedImage image = new Robot().createScreenCapture(new Rectangle((int) frame.getLocationOnScreen().getX(), (int) frame.getLocationOnScreen().getY(), frame.getWidth(), frame.getHeight()));
...
if (printJob.printDialog()) {
try {
printJob.print();
} catch (Exception PrintException) {
PrintException.printStackTrace();
}
}
人工的な Thread.sleep() を使用する代わりに、印刷ダイアログを表示する前にスクリーンショットのキャプチャが終了したことを示す方法はありますか?
編集 :
OK、私は自分が何を間違えたかを理解したと思います。実際に起こっていたのは、印刷ダイアログが表示されてユーザーが [OK] をクリックした後、印刷ダイアログがアニメーションで消える前に画面がキャプチャされていたことです。これは、次のコードが原因でした。
// Print button action listener
public class printButtonPressed implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
PrinterJob printJob = PrinterJob.getPrinterJob ();
Book book = new Book ();
PageFormat documentPageFormat = new PageFormat ();
documentPageFormat.setOrientation(PageFormat.LANDSCAPE);
book.append(new Page(), documentPageFormat);
printJob.setPageable(book);
if (printJob.printDialog()) {
try {
printJob.print();
} catch (Exception PrintException) {
PrintException.printStackTrace();
}
}
}
}
// Create printable page
private class Page implements Printable {
public int print (Graphics g, PageFormat pageFormat, int page) {
JFrame frame = Main.frame;
try { // THIS SHOULD NOT BE HERE
screenShot = new Robot().createScreenCapture(new Rectangle((int) frame.getLocationOnScreen().getX(), (int) frame.getLocationOnScreen().getY(), frame.getWidth(), frame.getHeight());
} catch (AWTException e) {
e.printStackTrace();
}
Graphics2D g2d = (Graphics2D) g;
g2d.translate (pageFormat.getImageableX (), pageFormat.getImageableY ());
int pageWidth = (int) pageFormat.getImageableWidth();
int newImageWidth = pageWidth;
int newImageHeight = (int)((double)newImageWidth/screenShot.getWidth(null)*screenShot.getHeight(null));
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.drawImage(screenShot, 0, 0, newImageWidth, newImageHeight, 0, 0, screenShot.getWidth(), screenShot.getHeight(), null);
return PAGE_EXISTS;
}
}
代わりに、Robot().createScreenCapture が PrinterJob の前に呼び出された場合、印刷ダイアログが表示される前に画面がキャプチャされ、この問題が解決されました。
// Print button action listener
public class printButtonPressed implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
JFrame frame = Main.frame;
try { // MOVE THIS UP HERE
screenShot = new Robot().createScreenCapture(new Rectangle((int) frame.getLocationOnScreen().getX(), (int) frame.getLocationOnScreen().getY(), frame.getWidth(), frame.getHeight());
} catch (AWTException e) {
e.printStackTrace();
}
PrinterJob printJob = PrinterJob.getPrinterJob ();
Book book = new Book ();
PageFormat documentPageFormat = new PageFormat ();
documentPageFormat.setOrientation(PageFormat.LANDSCAPE);
book.append(new Page(), documentPageFormat);
printJob.setPageable(book);
if (printJob.printDialog()) {
try {
printJob.print();
} catch (Exception PrintException) {
PrintException.printStackTrace();
}
}
}
}
// Create printable page
private class Page implements Printable {
public int print (Graphics g, PageFormat pageFormat, int page) {
Graphics2D g2d = (Graphics2D) g;
g2d.translate (pageFormat.getImageableX (), pageFormat.getImageableY ());
int pageWidth = (int) pageFormat.getImageableWidth();
int newImageWidth = pageWidth;
int newImageHeight = (int)((double)newImageWidth/screenShot.getWidth(null)*screenShot.getHeight(null));
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.drawImage(screenShot, 0, 0, newImageWidth, newImageHeight, 0, 0, screenShot.getWidth(), screenShot.getHeight(), null);
return PAGE_EXISTS;
}
}