Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Подскажите что не так в программе


Автор: andruxai 24.11.2018, 16:50
Всем привет. Пишу программку которая сканирует экран в поисках определенного цвета пикселя. Все работало до того как я решил немного её модернизировать, сперва область для сканирования забивалась ручками в код программы, а теперь я сделал так что координаты сканования я получаю от того где я нажму мышкой на принскрине экрана. Теперь у меня программа ругается на эту строчку, и не пойму что не так, ведь все должно работать. Подскажите пожалуйста где я накосячил. 
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: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) {

    }
}
Код



Автор: LSD 26.11.2018, 14:48
В классе Scan поле robot не инициализируется при создании, только в main().

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)