当前位置: 首页 > 面试题库 >

Swing:创建可拖动组件…?

壤驷安和
2023-03-14
问题内容

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

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

我将感谢没有非标准API的示例。

谢谢。


问题答案:

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

我该怎么办?

  • 当按下鼠标时,我 在屏幕上* 记录了 光标的 位置以及 组件的 位置。 ***
  • 拖动鼠标时,我将计算新 光标* 和旧 光标 在屏幕上 位置之间的 差异 ,并 根据该差异 移动组件。 *

在最新的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);
  }

}


 类似资料:
  • 本文向大家介绍c#可以创建任意控件的拖动方法,包括了c#可以创建任意控件的拖动方法的使用技巧和注意事项,需要的朋友参考一下 经常进行图形界面设计的编程者肯定知道,控件在设计的时候才能随意拖动,运行的时候就不能拖动了. 你肯定会问:运行时能随意拖动控件吗?答案是肯定的,我们的项目涉及到了这一点,我已经实现了,实际上很简单的哟.我就拿出来给你们show一下,哈哈,各位高手不要笑我哟。 我们先从简单的入

  • 问题内容: 我正在matplotlib中的轴对象上绘制图例,但是声称将其放置在智能位置的默认定位似乎不起作用。理想情况下,我希望图例可由用户拖动。如何才能做到这一点? 问题答案: 注意:现在已内置到matplotlib中 将按预期工作 好吧,我发现解决方案的点点滴滴分散在邮件列表中。我提出了一个很好的模块化代码块,您可以插入并使用…在这里: …以及您的代码中… 我给Matplotlib-users

  • 如何在Javafx 2.0中制作可拖动节点。JavaFX专门用于GUI目的,仅我需要一些示例,谢谢

  • 问题内容: 最近,我问哪个绑定到BigDecimal变量(具有某些特定的编辑属性)是最好的Swing组件。事实证明,没有一个标准的Swing组件完全适合我,我在那里也没有找到第三方Swing组件库。因此,我决定创建自己的Swing组件。 我想扩展JTextField或JFormattedTextField,因此我的新组件可以轻松地绑定到BigDecimal变量。 该组件将具有可自定义的 比例 和

  • jQueryUI提供了draggable()方法,可以使任何DOM元素可拖动。 一旦元素可拖动,您可以通过用鼠标单击它并将其拖动到视口内的任何位置来移动该元素。 语法 (Syntax) draggable()方法可以使用两种形式 - $(selector,context).draggable(options)方法 $(selector,context).draggable(“action”,[pa

  • 你好,我想在java swing中创建一个Jlist,但是我不知道在哪里可以显示它。到目前为止,我看到的所有教程都在一个新窗口中创建列表,这不是我想要的。我想使用一个工具或其他东西来给出我当前所在的框架的具体坐标和位置。我是java swing新手,所以我可能需要一些帮助。我使用windows builder pro作为eclipse的插件。有没有什么工具可以让我用来“画”出列表的显示位置? Th