Всем привет. Пишу программку которая сканирует экран в поисках определенного цвета пикселя. Все работало до того как я решил немного её модернизировать, сперва область для сканирования забивалась ручками в код программы, а теперь я сделал так что координаты сканования я получаю от того где я нажму мышкой на принскрине экрана. Теперь у меня программа ругается на эту строчку, и не пойму что не так, ведь все должно работать. Подскажите пожалуйста где я накосячил.
https://ibb.co/g0X3nAException 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:722)
Код |
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) {
}
}