There are number of problems with this code
public class LineEx extends JFrame implements MouseMotionListener,MouseListener{
int x1,y1,x2,y2;
public Line
- MouseEvents are not getting exact co-ordinates that means whenever i draw a line it is not on its position. What is the reason behind this?
- I want to move line along the image when scrollbar goes up and down, how can i do that?
You are getting the correct coordinates from the JLabel
but paints on the JFrame
. And the frame coordinates begins at the top left point and "includes" the window title/border.
Override the paintComponent
method on the JLabel
and it you will get the correct insets and coordinates.
Example:
class ImageComponent extends JComponent
implements MouseListener, MouseMotionListener {
private final BufferedImage img;
private Point p1, p2;
public ImageComponent(URL url) throws IOException {
img = ImageIO.read(url);
setPreferredSize(new Dimension(img.getWidth(), img.getHeight()));
addMouseListener(this);
addMouseMotionListener(this);
}
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), this);
if (p1 != null && p2 != null)
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
@Override public void mousePressed(MouseEvent e) {
p1 = e.getPoint();
}
@Override public void mouseDragged(MouseEvent e) {
mouseReleased(e);
}
@Override public void mouseReleased(MouseEvent e) {
p2 = e.getPoint();
repaint();
}
@Override public void mouseMoved(MouseEvent e) {}
@Override public void mouseClicked(MouseEvent e) {}
@Override public void mouseEntered(MouseEvent e) {}
@Override public void mouseExited(MouseEvent e) {}
}
Test code (generates this screenshot):
public static void main(String[] args) throws Exception {
final URL lenna =
new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png");
final ImageComponent image = new ImageComponent(lenna);
JFrame frame = new JFrame("Test");
frame.add(new JScrollPane(image));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
}
JFrame
).BufferedImage
that was loaded.GridBagLayout
with no constraint, so it is centered.BorderLayout.CENTER
) of a parent component.Note that you might also add the line objects to an expandable collection such as an ArrayList
or DefaultListModel, then display them in a JList
to the WEST
of the image scroll pane. This would make it easier to manage (and potentially delete) groups of lines.