Как захватить изображение с jframe? (Слишком быстро) - PullRequest
0 голосов
/ 13 июня 2011

Я успешно делал это раньше, но теперь после многократного запуска программы сбой происходит на скриншоте слишком быстро.И оно не будет принимать правильное изображение, оно принимает его, поскольку jframe исчезает. Как мне это исправить? Error

Редактировать: Так что в основномЯ пытаюсь запечатлеть изображение Jpanels внутри JFrame, но в процессе этого, вызывая его из макроса Excel, полученное изображение оказывается выше, чем нужное мне изображение.

import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
public class TimeTableGraphicsRunner extends JFrame
{
    public TimeTableGraphicsRunner()
    {
        getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS));
    }
    public void load(TimeTablePanel pan)
    {
        pan.setTitle(x.getTitle(TimeTable.titleCount));
        getContentPane().add(pan);
    }
    public void run()throws Exception
    {
        System.out.println("Creating image in panel");
        //setSize(TimeTable.width,TimeTable.height);
        getContentPane().setPreferredSize(new java.awt.Dimension(TimeTable.width,TimeTable.height));
        pack();
        setVisible(true);
        System.out.println("Image is in panel");
        grabScreenShot();
        System.out.println("Cleaning up");
        setVisible(false);
        System.out.println("Finished");
        System.exit(0);
    }
    private void grabScreenShot() throws Exception
    {
        BufferedImage image = (BufferedImage)createImage(getContentPane().getSize().width,getContentPane().getSize().height);
        getContentPane().paint(image.getGraphics());
        try{
            ImageIO.write(image, "png", new File("C:\\Users\\"+TimeTable.user+"\\AppData\\TimeLineMacroProgram\\TimeLine.png"));
            System.out.println("Image was created");
        }
        catch (IOException e){
            System.out.println("Had trouble writing the image.");
            throw e;
        }
    }
}

1 Ответ

1 голос
/ 14 июня 2011

Операционная система требует времени для создания и отображения кадра.Таким образом, действие снимка экрана выполняется до того, как кадр может быть полностью отображен.

Обойти его можно несколькими способами.Лучше всего использовать ComponentListener.

public class TimeTableGraphicsRunner extends JFrame implements ComponentListener
{
    public TimeTableGraphicsRunner()
    {
        addComponentListener(this);
        ... snip
    }

    ... snip

    public void componentShown(ComponentEvent e) {
        grabScreenShot();
        System.out.println("Cleaning up");
        setVisible(false);
        System.out.println("Finished");
        System.exit(0);
    }
}
...