Note that there are some explanatory texts on larger screens.

plurals
  1. POTrigger MouseListener when pressing on my JComponent, even if it is transformed by an AffineTransform
    primarykey
    data
    text
    <p>I am trying to add a MouseListener to my custom JComponent. I just want the MouseListener to be triggered when pressing withing the bounds of the circle (the JComponent's painting method draws a circle). I have tried with the below code but I just cannot get it to work (loook especially in the <code>mousePressed</code> method). How can I tackle this problem?</p> <p>The SSCCE:</p> <pre><code>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(); } } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload