import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.WindowEvent; import java.awt.event.WindowAdapter; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.event.MouseInputAdapter; import java.awt.BorderLayout; import java.util.Observer; import javax.swing.JFrame; import javax.swing.JComponent; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Color; import java.awt.Rectangle; import java.awt.Font; import java.awt.BasicStroke; import java.awt.Component; import java.awt.geom.Point2D; import java.awt.geom.Line2D; import java.awt.geom.Rectangle2D; import java.awt.geom.Ellipse2D; import java.awt.font.TextLayout; public class DragandDropImproved { private static JFrame window; // The application window private static Board view; // The view of the sketch static MouseHandler mouseHandler; static boolean picked = false; // true if rect has been picked static double dx, dy; // difference between location of cursor and location of rect static Point2D.Double corner = new Point2D.Double(50.0,50.0); //corner of rect static Rectangle2D.Double rect = new Rectangle2D.Double(corner.getX(),corner.getY(),140.0,100.0); public static void main(String[] args) { window = new JFrame("Drag and Drop a Rectangle (using XOR)"); // Create the app window window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Default is exit the application Toolkit theKit = window.getToolkit(); // Get the window toolkit Dimension wndSize = theKit.getScreenSize(); // Get screen size // Set the position to screen center & size to half screen size window.setBounds(wndSize.width/4, wndSize.height/4, // Position wndSize.width/2, wndSize.height/2); // Size view = new Board(); // Create the view mouseHandler = new MouseHandler(); view.addMouseListener(mouseHandler); view.addMouseMotionListener(mouseHandler); window.getContentPane().add(view, BorderLayout.CENTER); window.setVisible(true); } static class Board extends JComponent{ public void paint(Graphics g) { g2D = (Graphics2D)g; // Get a 2D device context g2D.setPaint(color); g2D.draw(rect); g2D.fill(rect); g2D.setFont(new Font("Arial", Font.PLAIN, 18)); g2D.draw(new Line2D.Float(240.0f, 120.0f, 80.0f, 200.0f)); g2D.draw(new Ellipse2D.Double(220.0,100.0,40.0,40.0)); g2D.setPaint(Color.RED); g2D.drawString("Thanksgiving",70,100); } // draw the rectangle (border only) using XOR mode public void drawRect() { g2D = (Graphics2D)getGraphics(); g2D.setXORMode(getBackground()); g2D.setPaint(color); float dash1[] = { 10.0f }; BasicStroke dashed = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash1, 0.0f); g2D.setStroke(dashed); g2D.draw(rect); } public Color color = Color.GREEN; private Graphics2D g2D = null; // Temporary graphics context } static class MouseHandler extends MouseInputAdapter { // remember location of rect relative to cursor if selected with left mouse button public void mousePressed(MouseEvent e) { if (rect.contains(e.getX(), e.getY()) && e.getButton() == MouseEvent.BUTTON1) { picked = true; dx = corner.getX() - e.getX(); dy = corner.getY() - e.getY(); } } // redraw rectangle if picked public void mouseDragged(MouseEvent e) { if (picked) { view.drawRect(); corner.setLocation(e.getX() + dx,e.getY() + dy); rect = new Rectangle2D.Double(corner.getX(),corner.getY(),140.0,100.0); view.drawRect(); } } // redraw picture public void mouseReleased(MouseEvent e) { if (picked) { picked = false; corner.setLocation(e.getX() + dx,e.getY() + dy); rect = new Rectangle2D.Double(corner.getX(),corner.getY(),140,100); view.repaint(); } } } }