我提出了一个简单但可行的解决方案,我自己找到了;)
我该怎么办?
- 当按下鼠标时,我 在屏幕上* 记录了 光标的 位置以及 组件的 位置。 ***
- 拖动鼠标时,我将计算新 光标* 和旧 光标 在屏幕上 的 位置之间的 差异 ,并 根据该差异 移动组件。 *
在最新的JDK 6和Linux(OpenSuse,KDE3)上进行了测试,
但是嘿,它是Java Swing,应该在任何地方都能正常工作。
代码如下:
import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;public class MyDraggableComponent extends JComponent { private volatile int screenX = 0; private volatile int screenY = 0; private volatile int myX = 0; private volatile int myY = 0; public MyDraggableComponent() { setBorder(new LineBorder(Color.BLUE, 3)); setBackground(Color.WHITE); setBounds(0, 0, 100, 100); setOpaque(false); addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { screenX = e.getXonScreen(); screenY = e.getYonScreen(); myX = getX(); myY = getY(); } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); addMouseMotionListener(new MouseMotionListener() { @Override public void mouseDragged(MouseEvent e) { int deltaX = e.getXonScreen() - screenX; int deltaY = e.getYonScreen() - screenY; setLocation(myX + deltaX, myY + deltaY); } @Override public void mouseMoved(MouseEvent e) { } }); }}public class Main { public static void main(String[] args) { Jframe f = new Jframe("Swing Hello World"); // by doing this, we prevent Swing from resizing // our nice component f.setLayout(null); MyDraggableComponent mc = new MyDraggableComponent(); f.add(mc); f.setSize(500, 500); f.setDefaultCloseOperation(Jframe.DISPOSE_ON_CLOSE); f.setVisible(true); }}


