Всем привет. Пишу программку которая сканирует экран в поисках определенного цвета пикселя. Все работало до того как я решил немного её модернизировать, сперва область для сканирования забивалась ручками в код программы, а теперь я сделал так что координаты сканования я получаю от того где я нажму мышкой на принскрине экрана. Теперь у меня программа ругается на эту строчку, и не пойму что не так, ведь все должно работать. Подскажите пожалуйста где я накосячил.
https://ibb.co/g0X3nA
Exception in thread "Thread-2" java.lang.NullPointerException
at Motorr.mrr(Motorr.java:11)
at Scan$1$1.run(Scan.java:75)
at java.lang.Thread.run(Thread.java:72 2)
Код:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Robot;
import javax.swing.JFrame;
import java.awt.AWTException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
class TransparentComponentListener
implements ComponentListener {
public void componentResized(ComponentEvent e) {
Component[] components = ((JFrame) e.getComponent())
.getContentPane().getComponents();
components[0].repaint();
}
public void componentMoved(ComponentEvent e) {
componentResized(e);
}
public void componentShown(ComponentEvent e) {
componentResized(e);
}
public void componentHidden(ComponentEvent e) {
componentResized(e);
}
}
public class Scan extends JFrame
{
Robot robot;
public static void main(String[] args)
{
final JFrame forma = new JFrame("Форма 1");
forma.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
forma.setSize(new Dimension(30, 300));
final JTextField x1 = new JTextField("",3);
final JTextField y1 = new JTextField("",3);
final JTextField x2 = new JTextField("",3);
final JTextField y2 = new JTextField("",3);
final JTextField x3 = new JTextField("",3);
final JTextField y3 = new JTextField("",3);
final JTextField x4 = new JTextField("",3);
final JTextField y4 = new JTextField("",3);
JButton batton1 = new JButton("Set");
JButton batton2 = new JButton("Start");
Scan s = new Scan();
try {
s.robot = new Robot();
} catch (AWTException ex) {
}
batton2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Start");
new Thread(new Runnable() {
@Override
public void run() {
Motorr mot = new Motorr();
mot.mrr();
}
}).start();
}
});
batton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
forma.setState(JFrame.ICONIFIED);
Timer timer = new Timer(50, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
JButton b2 = new JButton("Exit");
final JFrame forma2 = new JFrame("Форма2");
forma2.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
forma2.setSize(new Dimension(150, 150));
forma2.addComponentListener(new TransparentComponentListener());
final Start app = new Start(forma2);
app.setLayout(new BorderLayout());
app.setVisible(true);
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
forma.setState(JFrame.NORMAL);
}
});
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
forma2.dispose();
}
});
app.add(b2,"North" );
forma2.getContentPane().add("Center", app);
forma2.pack();
forma2.setExtendedState(JFrame.MAXIMIZED_BOTH);
forma2.show();
app.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
if(app.count<4){
int x = e.getX();
int y = e.getY();
app.m[app.i][app.j]=x;
app.m[app.i][app.j+1]=y;
System.out.println("x = " + app.m[app.i][app.j]);
System.out.println("y = " + app.m[app.i][app.j+1]);
app.i++;
app.count++;
}else{
System.out.println("Печатаю ввесь массив:");
for(int i=0;i<4;i++){
for(int j=0;j<2;j++){
System.out.print(app.m[i][j]+" ");
}
System.out.println();
x1.setText(Integer.toString(app.m[0][0]));
y1.setText(Integer.toString(app.m[0][1]));
x2.setText(Integer.toString(app.m[1][0]));
y2.setText(Integer.toString(app.m[1][1]));
x3.setText(Integer.toString(app.m[2][0]));
y3.setText(Integer.toString(app.m[2][1]));
x4.setText(Integer.toString(app.m[3][0]));
y4.setText(Integer.toString(app.m[3][1]));
}
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
forma2.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
super.windowClosed(e);
forma.setState(Frame.NORMAL);
}
});
forma2.setLocationRelativeTo(null);
forma2.setVisible(true);
}
});
timer.setRepeats(false);
timer.start();
}
});
JPanel panel = new JPanel();
panel.add (x1);
panel.add (y1);
panel.add (x2);
panel.add (y2);
panel.add (x3);
panel.add (y3);
panel.add (x4);
panel.add (y4);
panel.add(batton1);
panel.add(batton2);
forma.getContentPane().add(panel);
forma.setLocationRelativeTo(null);
forma.setVisible(true);
}
}
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.image.BufferedImage;
public class Motorr {
public Scan m=new Scan();
public void mrr(){
Rectangle rec = new Rectangle(0, 0, 1023, 767);
BufferedImage img=m.robot.createScreenCapture(rec);
for(;;){
for (int i=50; i <= 870; i++) {
for (int j = 100; j <= 666; j++) {
Color c1 = new Color(img.getRGB(i, j));
Color col=new Color(111,0,0);
if(c1.equals(col)) {
Color c2 = new Color(img.getRGB(i+64, j));
if(c2.equals(col)) {
m.robot.mouseMove(i+25, j-30);
m.robot.mousePress(InputEvent.BUTTON1_MASK);
m.robot.mouseRelease(InputEvent.BUTTON1_MASK);
m.robot.delay(430);
m.robot.keyPress(17);
m.robot.delay(60);
m.robot.keyRelease(17);
}else{
Color c3 = new Color(img.getRGB(i+67, j));
if(c3.equals(col)) {
m.robot.mouseMove(i+25, j-30);
m.robot.mousePress(InputEvent.BUTTON1_MASK);
m.robot.mouseRelease(InputEvent.BUTTON1_MASK);
m.robot.delay(430);
m.robot.keyPress(17);
m.robot.delay(60);
m.robot.keyRelease(17);
}
}
}
}
}
img=m.robot.createScreenCapture(rec);
}
}
}
import javax.swing.*;
import java.awt.*;
public class Start extends JComponent {
int count =0;
int i= 0;
final int j =0;
final int m[][]= new int [4][2];
private JFrame frame;
private Image background;
public Start(JFrame frame) {
this.frame = frame;
updateBackground();
}
public void updateBackground() {
try {
Robot rbt = new Robot();
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension dim = tk.getScreenSize();
background = rbt.createScreenCapture(
new Rectangle(0, 0, (int) dim.getWidth(),
(int) dim.getHeight()));
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void paintComponent(Graphics g) {
Point pos = this.getLocationOnScreen();
Point offset = new Point(-pos.x, -pos.y);
g.drawImage(background, offset.x, offset.y, null);
}
public static void main(String[] args) {
}
}