0

アプリケーションでスクリーンショットを撮り、印刷ダイアログを表示して、ユーザーがスクリーンショットを印刷できるようにしたいと考えています。ただし、スクリーンショットの取得が遅すぎる/ダイアログの表示が速すぎるため、ダイアログがスクリーンショットに表示されます (以下を参照)。

ここに画像の説明を入力

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;
    }
}
4

1 に答える 1

0

配列にダンプし、配列全体を解析すると、すべてがそこにあることを保証できます

私が意味するのはこれです

BufferedImage TestShot = iris.createScreenCapture(new Rectangle(0,0,width,height));
int[] ImgData = null;
TestShot.getRGB(0, 0, width, height, ImgData, 0, 0);
for(int i:ImgData){
    // count or something
}
// all of it is there in TestShot

それはうまくいくはずです。なぜこれに問題があるのか​​ わかりません.私は常にロボットを使用しており、スクリーンショット機能はすぐに機能します. おそらく、もっと時間がかかる printJob です。

于 2013-06-10T16:24:45.513 に答える