Java BounceBall событие мыши

1

Я работаю с приведенным ниже примером. И у меня есть трудности. Необходимо, чтобы шары уклонились от указателя мыши. Измените направление, когда они найдут указатель.

Я попытался передать в качестве параметра позицию мыши функции "move", но получить ошибку: "Исключение в потоке" Thread-2 "java.lang.NullPointerException"

Может ли кто-нибудь дать мне подсказку, как это сделать? Я потерялся.

Код:

public class SimpleBalls {

    private Point mousePoint;

    public static void main(String[] args) {
        new SimpleBalls();
    }

    public SimpleBalls() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager
                            .getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Spot");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                Balls balls = new Balls();
                frame.add(balls);
                frame.setSize(400, 400);
                frame.setVisible(true);

                new Thread(new BounceEngine(balls)).start();

            }
        });
    }

    public static int random(int maxRange) {
        return (int) Math.round((Math.random() * maxRange));
    }

    public class Balls extends JPanel {

        private List<Ball> ballsUp;

        public Balls() {
            ballsUp = new ArrayList<Ball>(25);

            MouseAdapter handler = new MouseAdapter() {

                @Override
                public void mouseMoved(MouseEvent e) {
                    mousePoint = e.getPoint();
                    // System.out.println(mousePoint);
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    mousePoint = e.getPoint();
                }

            };

            addMouseListener(handler);
            addMouseMotionListener(handler);

            for (int index = 0; index < 10 + random(10); index++) {
                ballsUp.add(new Ball(new Color(random(255), random(255),
                        random(255))));
            }

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            for (Ball ball : ballsUp) {
                ball.paint(g2d);
            }
            g2d.dispose();
        }

        public List<Ball> getBalls() {
            return ballsUp;
        }
    }

    public class BounceEngine implements Runnable {

        private Balls parent;

        public BounceEngine(Balls parent) {
            this.parent = parent;
        }

        @Override
        public void run() {

            int width = getParent().getWidth();
            int height = getParent().getHeight();

            for (Ball ball : getParent().getBalls()) {
                int x = random(width);
                int y = random(height);

                Dimension size = ball.getSize();

                if (x + size.width > width) {
                    x = width - size.width;
                }
                if (y + size.height > height) {
                    y = height - size.height;
                }

                ball.setLocation(new Point(x, y));

            }

            while (getParent().isVisible()) {

                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        getParent().repaint();
                    }
                });

                for (Ball ball : getParent().getBalls()) {
                    move(ball, mousePoint);
                }

                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }

            }

        }

        public Balls getParent() {
            return parent;
        }

        public void move(Ball ball, Point mouse) {

            try {
                Point p = ball.getLocation();
                Point speed = ball.getSpeed();
                Dimension size = ball.getSize();

                System.out.println(mouse.x);

                int vx = speed.x;
                int vy = speed.y;

                int x = p.x;
                int y = p.y;

                if (x + vx < 0 || x + size.width + vx > getParent().getWidth()) {
                    vx *= -1;
                }
                if (y + vy < 0 || y + size.height + vy > getParent().getHeight()) {
                    vy *= -1;
                }
                x += vx;
                y += vy;

                ball.setSpeed(new Point(vx, vy));
                ball.setLocation(new Point(x, y));

            } catch (Exception e) {
                e.printStackTrace();
            }           

        }

    }

    public class Ball {

        private Color color;
        private Point location;
        private Dimension size;
        private Point speed;
        private int dimeter;

        public Ball(Color color) {
            Random rnd = new Random();
            dimeter = 10 + rnd.nextInt(35);

            setColor(color);

            speed = new Point(10 - random(20), 10 - random(20));
            size = new Dimension(dimeter, dimeter);

        }

        public Dimension getSize() {
            return size;
        }

        public void setColor(Color color) {
            this.color = color;
        }

        public void setLocation(Point location) {
            this.location = location;
        }

        public Color getColor() {
            return color;
        }

        public Point getLocation() {
            return location;
        }

        public Point getSpeed() {
            return speed;
        }

        public void setSpeed(Point speed) {
            this.speed = speed;
        }

        protected void paint(Graphics2D g2d) {

            Point p = getLocation();
            if (p != null) {
                g2d.setColor(getColor());
                Dimension size = getSize();
                g2d.fillOval(p.x, p.y, size.width, size.height);
            }

        }
    }
}

Благодарю.

EDIT: ошибка..

java.lang.NullPointerException
    at balls.SimpleBalls$BounceEngine.move(SimpleBalls.java:170)
    at balls.SimpleBalls$BounceEngine.run(SimpleBalls.java:146)
    at java.lang.Thread.run(Unknown Source)
  • 1
    Мы могли бы, если вы предоставите трассировку стека ...
  • 0
    @Aeshang Я поместил Try Catch в метод «move», и, пока мышь находится за пределами экрана, печатает ошибку, когда вы вводите в первый раз, и печатает для позиции. Но не знаю, как изменить направление при поиске указателя.
Показать ещё 2 комментария
Теги:
swing
mouseevent
java-ee

1 ответ

5
Лучший ответ

Проблема заключается в том, что mousepoint не может быть установлена с помощью mousepoint времени move(). Просто проверьте, не является ли значение null в методе move(). Это не похоже на то, что вы начали добавлять код, чтобы "уклониться от указателя мыши". Я предполагаю, что вы можете справиться с тем, чтобы выяснить, что часть сама по себе.

public void move(Ball ball, Point mouse) {
     Point p = ball.getLocation();
     Point speed = ball.getSpeed();
     Dimension size = ball.getSize();

     if (mouse != null) {
         System.out.println(mouse.x);  // here 
     }

     int vx = speed.x;
     int vy = speed.y;
     // ...
  • 0
    Ошибки больше нет Теперь измените направление.
  • 0
    @ FernandoA.W .: Виски ответил на ваш вопрос, теперь вы меняете вопрос. Возможно, вам следует принять этот ответ и либо задать новый вопрос, либо сначала попытаться решить проблему изменения направления самостоятельно (это имеет мой голос), и только если это не сработает, тогда вернитесь с новым вопросом с вашим новая попытка кода. 1+, чтобы ответить.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню