如何拖动对象

我想拖动一个框,我希望我的鼠标光标是我在拖动矩形时在矩形中单击的位置。 我试过这个代码,当我试图拖动时,我遇到了一堆错误。

import objectdraw.*; import java.awt.*; public class TouchWindow extends WindowController { private FilledRect a; private boolean b; private Location c; private int x; private int y; public void begin() { b=false; a=new FilledRect(0,0,50,50,canvas); } public void onMouseClick(Location pt) { if(a.contains(pt)) { b=true; pt=c; } } public void onMouseDrag(Location pt2) { if(b==true) { x=(int)c.getX()-(int)pt2.getX(); y=(int)c.getY()-(int)pt2.getY(); a.move(x,y); } } } 

嗯,这是我躺在身边的一个例子,虽然不是一个applet,它可以非常简单地移植。

在此处输入图像描述

 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class ShapeMover { public ShapeMover() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Shape Mover"); initComponents(frame); frame.pack(); frame.setVisible(true); } public static void main(String s[]) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new ShapeMover(); } }); } private void initComponents(JFrame frame) { frame.getContentPane().add(new DragPanel()); } } class DragPanel extends JPanel { Rectangle rect = new Rectangle(0, 0, 100, 50); int preX, preY; boolean isFirstTime = true; Rectangle area; boolean pressOut = false; private Dimension dim = new Dimension(400, 300); public DragPanel() { setBackground(Color.white); addMouseMotionListener(new MyMouseAdapter()); addMouseListener(new MyMouseAdapter()); } @Override public Dimension getPreferredSize() { return dim; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; if (isFirstTime) { area = new Rectangle(dim); rect.setLocation(50, 50); isFirstTime = false; } g2d.setColor(Color.black); g2d.fill(rect); } boolean checkRect() { if (area == null) { return false; } if (area.contains(rect.x, rect.y, rect.getWidth(), rect.getHeight())) { return true; } int new_x = rect.x; int new_y = rect.y; if ((rect.x + rect.getWidth()) > area.getWidth()) { new_x = (int) area.getWidth() - (int) (rect.getWidth() - 1); } if (rect.x < 0) { new_x = -1; } if ((rect.y + rect.getHeight()) > area.getHeight()) { new_y = (int) area.getHeight() - (int) (rect.getHeight() - 1); } if (rect.y < 0) { new_y = -1; } rect.setLocation(new_x, new_y); return false; } private class MyMouseAdapter extends MouseAdapter { @Override public void mousePressed(MouseEvent e) { preX = rect.x - e.getX(); preY = rect.y - e.getY(); if (rect.contains(e.getX(), e.getY())) { updateLocation(e); } else { pressOut = true; } } @Override public void mouseDragged(MouseEvent e) { if (!pressOut) { updateLocation(e); } else { } } @Override public void mouseReleased(MouseEvent e) { if (rect.contains(e.getX(), e.getY())) { updateLocation(e); } else { pressOut = false; } } public void updateLocation(MouseEvent e) { rect.setLocation(preX + e.getX(), preY + e.getY()); checkRect(); repaint(); } } }