Eu estou tentando fazer um programa que tire várias prints da tela mas está me dando erro.
Exception in thread "Thread-0" java.lang.NullPointerException
at screenrecorder.Main.recorder(Main.java:77)
at screenrecorder.Main.tick(Main.java:72)
at screenrecorder.Main.run(Main.java:87)
at java.base/java.lang.Thread.run(Thread.java:834)
O código é o seguinte:
package print;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Main extends Canvas implements Runnable,ActionListener {
private int WIDTH = 160;
private int HEIGHT = 120;
private int SCALE = 2;
private boolean isRunning;
private Rectangle allScreen;
private int counter;
private JFrame frame;
private JButton btn;
private Thread thread;
private Robot robot;
public Main() {
this.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT*SCALE));
allScreen = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
}
public void window() {
frame = new JFrame();
btn = new JButton("Print");
btn.setBounds(120, 80, 80, 25);
btn.setVisible(true);
btn.addActionListener(this);
frame.add(btn);
frame.add(this);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
Main main = new Main();
main.window();
main.start();
}
public synchronized void start() {
thread = new Thread(this);
thread.start();
}
public synchronized void stop() {
}
public void tick() {
if(isRunning) {
recorder();
}
}
public void recorder() {
BufferedImage print = robot.createScreenCapture(allScreen);
try {
ImageIO.write(print, "png", File.createTempFile("image", "png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while(true) {
tick();
try {
thread.sleep(1000/60);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void actionPerformed(ActionEvent e) {
isRunning = true;
}
}
O código está funcionando, só da erro quando eu coloco essa parte:
BufferedImage print = robot.createScreenCapture(allScreen);
try {
ImageIO.write(print, "png", File.createTempFile("image", "png"));
} catch (IOException e) {
e.printStackTrace();
}