• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

How to add mouse listener?

 
Ranch Hand
Posts: 428
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thanks Craig!

How do I add a mouse listener to this? I tried making PanAndZoom implement MouseListener, MouseMotionListener and adding the function
public void init(){
addMouseListener(this);
addMouseMotionListener(this);
}
(and calling init(), of course).

I assume I'll have to insert the code to translate the mouse coordinates to the document coordinates correct?

Thanks,
Siegfried
 
Siegfried Heintze
Ranch Hand
Posts: 428
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Woops -- I intented this to be a reply to an existing topic! Here is the code I was talking about that Craig had graciously provided. After I figure out how to draw rectangles by dragging the mouse, I want to make it into an applet. I hope making it into an Applet will be straight forward.

Thanks,
Siegfried

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.event.*;

public class PanAndZoom implements ChangeListener {
BufferedImage image;
JLabel label;

public void stateChanged(ChangeEvent e) {
int value = ((JSlider)e.getSource()).getValue();
double scale = value/100.0;
BufferedImage scaled = getScaledImage(scale);
label.setIcon(new ImageIcon(scaled));
label.revalidate(); // signal scrollpane
}

private BufferedImage getScaledImage(double scale) {
int w = (int)(scale*image.getWidth());
int h = (int)(scale*image.getHeight());
BufferedImage bi = new BufferedImage(w, h, image.getType());
Graphics2D g2 = bi.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
AffineTransform at = AffineTransform.getScaleInstance(scale, scale);
g2.drawRenderedImage(image, at);
g2.dispose();
return bi;
}

private JLabel getContent() {
createAnImage();
label = new JLabel(new ImageIcon(image));
label.setHorizontalAlignment(JLabel.CENTER);
return label;
}

private void createAnImage() {
int w = 500;
int h = 500;
int type = BufferedImage.TYPE_INT_RGB; // many options
image = new BufferedImage(w, h, type);
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
RenderingHints.VALUE_STROKE_PURE);
g2.setPaint(new Color(240,200,200));
g2.fillRect(0,0,w,h);
g2.setPaint(Color.blue);
g2.draw(new Rectangle2D.Double(w/16, h/16, w*7/8, h*7/8));
g2.setPaint(Color.green.darker());
g2.draw(new Line2D.Double(w/16, h*15/16, w*15/16, h/16));
Ellipse2D e = new Ellipse2D.Double(w/4, h/4, w/2, h/2);
g2.setPaint(new Color(240,240,200));
g2.fill(e);
g2.setPaint(Color.red);
g2.draw(e);
g2.dispose();
}

private JSlider getControl() {
JSlider slider = new JSlider(JSlider.HORIZONTAL, 50, 200, 100);
slider.setMajorTickSpacing(50);
slider.setMinorTickSpacing(10);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.addChangeListener(this);
return slider;
}

public static void main(String[] args) {
PanAndZoom app = new PanAndZoom();
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(app.getContent()));
f.getContentPane().add(app.getControl(), "Last");
f.setSize(400, 400);
f.setLocation(200,200);
f.setVisible(true);
}
}
 
Ranch Hand
Posts: 1535
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Here's an entry into the tutorial for writing listeners: Lesson: Writing Event Listeners. And the page on MouseListeners: How to Write a Mouse Listener.

I assume I'll have to insert the code to translate the mouse coordinates to the document coordinates correct?
Yes. If you add the MouseListener and/or MouseMotionListener to the JLabel then the mouse coordinates will be accurate for the image, ie, (0,0) will be the upper left corner of the image. You can add a JLabel to the south section of the JFrames BorderLayout and read out the mouse position from the mouseMoved method in your MouseMotionListener to verify this.
 
reply
    Bookmark Topic Watch Topic
  • New Topic