java – Swing:创建一个可拖动的组件……?

我在网上搜索了可拖动的Swing组件的例子,
但我发现不完整或不工作的例子.

我需要的是可以通过鼠标拖动的Swing组件
在另一个组件内.在被拖拽的同时,它应该已经存在
改变它的位置,而不仅仅是“跳”到目的地.

我希望能够在没有非标准API的情况下工作的示例.

谢谢.

解决方法:

我提出了一个简单但工作良好的解决方案,由我自己找到;)

我该怎么办?

>按下鼠标时,我在屏幕上记录光标的位置,然后
组件的位置.
>拖动鼠标时,我计算新的和之间的差异
旧光标在屏幕上的位置,并移动
由这种差异组成.

使用最新的JDK 6 unter 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);
  }

}
上一篇:Java – 直观地拖动一个swing元素


下一篇:javascript-如何手动触发jQuery drag()函数?像$(element).trigger(‘drag’);