Как захватить изображение из jframe?(слишком быстро)

#java #image #screenshot #jframe

#java #изображение #скриншот #jframe

Вопрос:

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

Редактировать: Итак, в основном я пытаюсь захватить изображение 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. да? хотите уточнить или предоставить какой-нибудь код? кстати, какая польза от скриншота?

2. Если скриншот выполняется слишком быстро, почему бы просто не перейти в режим ожидания (1000) в потоке, с помощью которого вы делаете скриншоты? Кроме того, вы изучали java.awt.Robot ?

3. SwingUtilities.invokeAndWait(...) может оказаться полезным, но нам действительно нужна доработка, иначе мы все останемся снимать в темноте.

4. Надеюсь, это поможет, потому что мне это обязательно нужно

5. все еще не ясно, чего вы пытаетесь достичь. не могли бы вы предоставить своего рода краткий обзор? это бы нам очень помогло… больше, чем та стена текста, которую вы опубликовали…

Ответ №1:

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

Вы можете обойти это несколькими способами. Вероятно, лучше всего использовать 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);
    }
}