0

カスタム JComponent に MouseListener を追加しようとしています。円の境界内で押すと、MouseListener がトリガーされるようにしたいだけです (JComponent の描画メソッドが円を描画します)。以下のコードを試してみましたが、動作させることができません (特にmousePressedメソッドを参照してください)。どうすればこの問題に取り組むことができますか?

SSCCE:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class AffineTransformTest {

    private static TransformingCanvas canvas;

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        canvas = new AffineTransformTest.TransformingCanvas();
        TranslateHandler translater = new TranslateHandler();
        canvas.addMouseListener(translater);
        canvas.addMouseMotionListener(translater);
        canvas.addMouseWheelListener(new ScaleHandler());
        frame.setLayout(new BorderLayout());
        frame.getContentPane().add(canvas, BorderLayout.CENTER);
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }

    private static class TransformingCanvas extends JComponent {

        private double translateX;
        private double translateY;
        private double scale;

        TransformingCanvas() {
            translateX = 0;
            translateY = 0;
            scale = 1;
            setOpaque(true);
            setDoubleBuffered(true);
        }

        @Override
        public void paint(Graphics g) {

            AffineTransform tx = new AffineTransform();
            tx.translate(translateX, translateY);
            tx.scale(scale, scale);
            Graphics2D ourGraphics = (Graphics2D) g;
            ourGraphics.setColor(Color.WHITE);
            ourGraphics.fillRect(0, 0, getWidth(), getHeight());
            ourGraphics.setTransform(tx);
            ourGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            ourGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            ourGraphics.setColor(Color.BLACK);
            ourGraphics.fillOval(50, 50, 50, 50);
        }
    }

    private static class TranslateHandler implements MouseListener,
            MouseMotionListener {

        private int lastOffsetX;
        private int lastOffsetY;

        public void mousePressed(MouseEvent e) {
            lastOffsetX = e.getX();
            lastOffsetY = e.getY();

            double width = canvas.scale * 50;
            double height = canvas.scale * 50;
            double x = (AffineTransformTest.canvas.getWidth() - width) / 2;
            double y = (AffineTransformTest.canvas.getHeight() - height) / 2;
            Rectangle2D.Double bounds = new Rectangle2D.Double(x, y, width, height);
            System.out.println(bounds + " " + e.getPoint());
            if (bounds.contains(e.getPoint())) {
                System.out.println("Click!");
            }
        }

        public void mouseDragged(MouseEvent e) {
            int newX = e.getX() - lastOffsetX;
            int newY = e.getY() - lastOffsetY;

            lastOffsetX += newX;
            lastOffsetY += newY;

            canvas.translateX += newX;
            canvas.translateY += newY;

            canvas.repaint();
        }

        public void mouseClicked(MouseEvent e) {
        }

        public void mouseEntered(MouseEvent e) {
        }

        public void mouseExited(MouseEvent e) {
        }

        public void mouseMoved(MouseEvent e) {
        }

        public void mouseReleased(MouseEvent e) {
        }
    }

    private static class ScaleHandler implements MouseWheelListener {

        public void mouseWheelMoved(MouseWheelEvent e) {
            if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
                canvas.scale += (.1 * e.getWheelRotation());
                canvas.scale = Math.max(0.00001, canvas.scale);
                canvas.repaint();
            }
        }
    }
}
4

2 に答える 2