Как использовать mouseClicked () с нерегулярным объектом - PullRequest
0 голосов
/ 13 мая 2018

Пока что мой метод mouseClicked () использует getX () и getY ().чтобы увидеть, нажимает ли пользователь на изображение легких.Однако, используя x и y, «зона» успеха - это коробка, а не форма легкого.В результате щелчок справа или слева от легкого также приводит к успешному щелчку в моем методе mouseClicked.Есть ли способ, которым я могу изменить это так, чтобы только щелчки по легкому генерировали успешное событие?

Заранее спасибо.

Щелчок в верхнем левом и нижнем правом углу левого легкого приводит к успешному событию, когда оно не должно

1 Ответ

0 голосов
/ 13 мая 2018

Простым решением будет использование API-интерфейса Графика 2D .

Это позволяет вам создать произвольную форму (многоугольник) и использовать ее различные функции обнаружения столкновений, чтобы определить, вошла ли мышь в нее или из нее

Например ...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Path2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

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

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private List<Shape> paths;
        private Shape filled;

        public TestPane() {
            double radius = 50;
            double orginX = 100;
            double orginY = 100;
            int dif = (int) (360 / 12d);
            paths = new ArrayList<>(25);

            for (int i = 0; i < 360; i += dif) {
                double angle = Math.toRadians(i);
                double centerX = radius * Math.cos(angle) + orginX;
                double centerY = radius * Math.sin(angle) + orginY;

                Path2D path = new Path2D.Double();
                path.moveTo(radius * Math.cos(angle + Math.toRadians(60)) + centerX, radius * Math.sin(angle + Math.toRadians(60)) + centerY);
                path.lineTo((radius * Math.cos(angle - Math.toRadians(60)) + centerX), (radius * Math.sin(angle - Math.toRadians(60)) + centerY));
                path.lineTo(orginX, orginY);
                paths.add(path);
            }

            addMouseMotionListener(new MouseAdapter() {
                @Override
                public void mouseMoved(MouseEvent e) {
                    filled = null;
                    for (Shape path : paths) {
                        if (path.contains(e.getPoint())) {
                            filled = path;
                            break;
                        }
                    }
                    repaint();
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g.create();
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
            for (Shape shape : paths) {
                if (shape == filled) {
                    g2.setColor(Color.BLUE);
                    g2.fill(shape);
                }
                    g2.setColor(Color.BLACK);
                g2.draw(shape);
            }
            g2.dispose();
        }
    }
}
...