【问题标题】:java move components with mousejava用鼠标移动组件
【发布时间】:2012-02-20 15:28:51
【问题描述】:

我试图通过简单地添加鼠标侦听器并使用java.awt.ComponentsetLocation 函数来使任何组件可拖动。我从JButton 开始测试是否可以按照我的想法进行。

这是我正在尝试做的代码示例:

import java.awt.*;
import javax.swing.*;

public class DragButton extends JButton{

private volatile int draggedAtX, draggedAtY;

public DragButton(String text){
    super(text);
    setDoubleBuffered(false);
    setMargin(new Insets(0, 0, 0, 0));
    setSize(25, 25);
    setPreferredSize(new Dimension(25, 25));

    addMouseListener(new MouseAdapter(){
        public void mousePressed(MouseEvent e){
            draggedAtX = e.getX() - getLocation().x;
            draggedAtY = e.getY() - getLocation().y;
        }
    });

    addMouseMotionListener(new MouseMotionAdapter(){
        public void mouseDragged(MouseEvent e){
            setLocation(e.getX() - draggedAtX, e.getY() - draggedAtY);
        }
    });
}

public static void main(String[] args){
    JFrame frame = new JFrame("DragButton");
    frame.setLayout(null);
    frame.getContentPane().add(new DragButton("1"));
    frame.getContentPane().add(new DragButton("2"));
    frame.getContentPane().add(new DragButton("3"));
    frame.setSize(300, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    }
}

不知何故,这无法正常工作,我不明白为什么。拖动的实际距离是鼠标移动距离的一半,并且在拖动时会在该距离周围闪烁,就好像两个鼠标位置在MouseMotionListener 上竞争。

有人可以帮助摇摆/awt 菜鸟吗? =) 非常感谢。

编辑:

好的,所以问题是我不知道该事件会在每个鼠标位置重新触发,位置相对(!)到触发JComponent。所以这是正确且有效的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DragButton extends JButton{

    private volatile int draggedAtX, draggedAtY;

    public DragButton(String text){
        super(text);
        setDoubleBuffered(false);
        setMargin(new Insets(0, 0, 0, 0));
        setSize(25, 25);
        setPreferredSize(new Dimension(25, 25));

        addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent e){
                draggedAtX = e.getX();
                draggedAtY = e.getY();
            }
        });

        addMouseMotionListener(new MouseMotionAdapter(){
            public void mouseDragged(MouseEvent e){
                setLocation(e.getX() - draggedAtX + getLocation().x,
                        e.getY() - draggedAtY + getLocation().y);
            }
        });
    }

    public static void main(String[] args){
        JFrame frame = new JFrame("DragButton");
        frame.setLayout(null);
        frame.getContentPane().add(new DragButton("1"));
        frame.getContentPane().add(new DragButton("2"));
        frame.getContentPane().add(new DragButton("3"));
        frame.setSize(300, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

感谢 Adel 的努力和 mKorbel 的链接。

【问题讨论】:

  • 另见ChessBoard
  • 是的,玻璃窗格当然是这里的最佳选择,但我试图让示例尽可能简单,但仍然可以编译。我希望这不会让未来的读者感到困惑。使用玻璃板! (或带有 DRAG_LAYER 的 layered pane

标签: java swing drag-and-drop awt mouselistener


【解决方案1】:

你必须和JComponent一起移动,我想念这个空洞里的定义mousePressed/mouseDragged;另一方面,没有什么比 @[camickr][1] 更好的代码了 ComponentMover

【讨论】:

  • 天哪,非常感谢您提供的链接!前几句让我撞到了头。 ^^ 我编辑了我的帖子以显示正确的代码。
  • 好吧,我最近做不到。 ;)
  • +1 表示 ComponentMover。为我省去了很多麻烦。谢谢
  • 我知道这是旧的,但你知道如何让 ComponentMover 在多个显示器上工作吗?
  • @Ryan 现在不知道,在 Java8 中也不知道(不能等待与 Java6 相比的一些变化),是否存在一些问题,然后创建一个新问题,并描述问题,链接到代码存储库、您的代码和 Java 版本、事件。使用 Native OS,也许有人可以测试一下 :-)
【解决方案2】:
import javax.swing.*;
import java.awt.event.*;    

public class movingButton extends JFrame{

    private JButton button ;

    public movingButton ()
    {
     super("Position helper");
       super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       super.setSize(500,520);
       super.setVisible(true);
       super.setLayout(null);
       button = new JButton ("drag me ");
       add(button);
       button.setBounds(100, 100, 150, 40);         
       button.addMouseMotionListener(new MouseAdapter(){

            public void mouseDragged(MouseEvent E)
            {
               int X=E.getX()+button.getX();
               int Y=E.getY()+button.getY;
               button.setBounds(X,Y,150,40);
            }
        });
    }

    public static void main (String x[])
    {           
        new movingButton();
    }
}

【讨论】:

  • 工作并且足够我需要做的但是拖动时鼠标指针偏离实际组件?有什么想法吗?
【解决方案3】:

你为什么不改用java Transferable接口呢?

这里有一个关于如何做到这一点的教程: http://www.javaworld.com/javaworld/jw-03-1999/jw-03-dragndrop.html

【讨论】:

  • java.awt.dnd 是否支持组件的移动动画?我不需要拖放的数据放置部分(我确实需要它,但这是一个小问题),而不是动画本身。我发现的大多数教程只描述了数据传输部分,其中只有光标表示拖放。我希望整个组件移动。 (对不起我的英语^^)
  • @Stephan Transferable 来自包 java.awt.datatransfer 所以它可以支持拖放在 awt
  • 对不起,但这并不能回答我的问题,但是我找到了一个使用 java.awt.dnd 和 java.awt.datatransfer 的拖放动画(!)的工作示例:link。不过,解决它并不有趣,因为他只链接了他的源代码。
  • 我通读了这些文章,但据我了解,在不使用Graphics 并手动绘制的情况下制作拖动动画并不常见。所以我更希望我的工作方式。 =) 如果有可能的话,那就是……
  • 我给你推荐的接口是我们在贵公司使用的。唯一的问题是它不是我做的,我只是使用它。所以不能帮你。对不起
【解决方案4】:

如果你愿意,那就更好了

int X=E.getX() + button.getX();
int Y=E.getY() + button.getY();

【讨论】:

  • 我不认为你的回答是正确的 - 首先你没有提供任何关于使用该 sn-p 的评论,其次你使用不同的字母大小。
猜你喜欢
  • 2019-08-08
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
相关资源
最近更新 更多