Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing:创建可拖动组件。。。?_Java_Swing_Drag And Drop_Draggable - Fatal编程技术网

Java Swing:创建可拖动组件。。。?

Java Swing:创建可拖动组件。。。?,java,swing,drag-and-drop,draggable,Java,Swing,Drag And Drop,Draggable,我在网上搜索了可拖动Swing组件的示例, 但我发现了不完整或不起作用的例子 我需要的是一个可以用鼠标拖动的摆动组件 在另一个组件内部。拖动时,它应该已经 改变它的位置,而不仅仅是“跳转”到它的目的地 如果没有非标准API,我将非常感谢这些示例 谢谢。我提出了一个简单但行之有效的解决方案,由我自己找到;) 我该怎么办 当按下鼠标时,我在屏幕上记录光标的位置,然后 组件的位置 拖动鼠标时,我计算新鼠标和新鼠标之间的差异 旧的光标在屏幕上的位置,然后移动 组件通过此差异 使用最新的JDK 6 u

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

我需要的是一个可以用鼠标拖动的摆动组件 在另一个组件内部。拖动时,它应该已经 改变它的位置,而不仅仅是“跳转”到它的目的地

如果没有非标准API,我将非常感谢这些示例


谢谢。

我提出了一个简单但行之有效的解决方案,由我自己找到;)

我该怎么办

  • 当按下鼠标时,我在屏幕上记录光标的位置,然后 组件的位置
  • 拖动鼠标时,我计算新鼠标和新鼠标之间的差异 旧的光标在屏幕上的位置,然后移动 组件通过此差异
使用最新的JDK 6 unter Linux(OpenSuse,KDE3)进行测试,
但是,嘿,它是JavaSwing,应该在任何地方都同样有效

下面是代码:

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);
  }

}

此外,我发现可以在JFrame中创建一个JInternalFrame, 但问题是:你总是会看到一个恼人的窗口标题栏

遗憾的是,要禁用标题栏,需要一个肮脏的解决方案

public class MyDraggableComponent extends JInternalFrame {

  public MyDraggableComponent() {
    InternalFrameUI thisUI = getUI();
    if (thisUI instanceof BasicInternalFrameUI) {
      ((BasicInternalFrameUI) thisUI).setNorthPane(null);
    }

}
我真的很怀念像“someInternalFrame.setWindowTitleBar(false)”这样的方法……

:'(

子类化可以提供
setWindowTitleBar()
方法!如果使用
MouseAdapter
MouseMotionAdapter
代替侦听器,则无需重写这些额外的方法。