Drawing a shape on an image
Hello,
I am trying to draw a shape over an image, but I'm having trouble with the size drawing the size of the rectangle. When the user clicks the mouse, the program is supposed to save both the starting points and endpoints then draw in a rectangle. However, it looks like the rectangle is doubling in size. Can someone please have a look at the code and tell me where I'm going wrong?
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
}
class MyFrame extends JFrame
{
private JPanel imagePanel;
private BufferedImage image;
private Dimension dim;
private Point2D.Double startPoint = new Point2D.Double();
private Point2D.Double endPoint = new Point2D.Double();
public MyFrame()
{
setTitle("Lab 7");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
try{
image = ImageIO.read(new File("simple.png"));
} catch (Exception e){
e.printStackTrace();
}
imagePanel = new JPanel(){
public void paint(Graphics g)
{
super.paint(g);
g.drawImage(image, 0, 0, null);
}
};
imagePanel.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
add(imagePanel);
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseSelect());
setFocusable(true);
addKeyListener(new KeyHandler());
pack();
setVisible(true);
}
class MouseHandler extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{
startPoint.x = e.getX();
startPoint.y = e.getY();
}
/*
public void mouseReleased(MouseEvent e)
{
endPoint.x = e.getX();
endPoint.y = e.getY();
}
*/
}
class KeyHandler extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == (KeyEvent.VK_X) )//| KeyEvent.VK_CONTROL))
{
System.out.println("CTRL X HAS BEEN CLICKED start "+startPoint.getX() + " "+startPoint.getY() + " end "+endPoint.getX()+ " " +endPoint.getY());
Graphics2D g = (Graphics2D) getGraphics();
g.setColor(Color.BLACK);
g.fillRect((int)startPoint.getX(), (int)startPoint.getY(), (int)endPoint.getX(), (int)endPoint.getY());
}
}
}
class MouseSelect extends MouseMotionAdapter {
@Override
public void mouseDragged(MouseEvent e) {
super.mouseDragged(e);
Graphics2D g = (Graphics2D) getGraphics();
g.setXORMode(Color.WHITE);
Rectangle2D.Double r = new Rectangle2D.Double(startPoint.x,startPoint.y, endPoint.x - startPoint.x, endPoint.y- startPoint.y);
g.draw(r);
endPoint.x = e.getX();
endPoint.y = e.getY();
r = new Rectangle2D.Double(startPoint.x, startPoint.y, endPoint.x- startPoint.x, endPoint.y - startPoint.y);
g.draw(r);
}
}
}
Thanks for any help.