Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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用鼠标移动组件_Java_Swing_Drag And Drop_Awt_Mouselistener - Fatal编程技术网

java用鼠标移动组件

java用鼠标移动组件,java,swing,drag-and-drop,awt,mouselistener,Java,Swing,Drag And Drop,Awt,Mouselistener,我试图通过简单地添加鼠标监听器和使用java.awt.Component的setLocation函数来拖动任何组件。我从JButton开始测试它是否可能以我所认为的方式实现 下面是我尝试执行的代码示例: import java.awt.*; import javax.swing.*; public class DragButton extends JButton{ private volatile int draggedAtX, draggedAtY; public DragButton(

我试图通过简单地添加鼠标监听器和使用
java.awt.Component
setLocation
函数来拖动任何组件。我从
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
上竞争一样

有人能帮我荡秋千吗 非常感谢

编辑:

好的,问题是我不知道事件会在每个鼠标位置重新出现,位置是相对于触发的
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的链接。

为什么不改用java接口呢

以下是有关如何执行此操作的教程:

您必须使用
JComponent
移动,我在空白
鼠标按下/鼠标标记
中错过了这些定义;在另一方面,没有什么比这更好的了。@[camickr][1]非常好的代码。

如果你愿意,那就更好了

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

另请参见。是的,玻璃窗格当然是解决这个问题的方法,但我试图使示例尽可能简单,但仍然是可编译的。我希望这不会让未来的读者感到困惑。使用玻璃窗!(或a及其拖动层)java.awt.dnd是否支持组件的移动动画?我不需要拖放的数据拖放部分(我确实需要它,但这是一个小问题),而不是动画本身。我找到的大多数教程只描述了数据传输部分,其中只有光标表示拖放。我希望整个组件都移动。(sry代表我的英语^^)@Stephan Transferable来自java.awt.datatransfer包,因此它可以支持awtSry中的拖放,但这并不能回答我的问题,但是我发现了一个使用java.awt.dnd和java.awt.datatransfer的拖放动画(!)的工作示例:。尽管这样做并不有趣,因为他只链接了他的源代码。我通读了这些文章,但据我所知,不使用
图形
并手动绘制拖动动画并不常见。所以我更希望我的工作方法如果有可能的话,那就是……我向你提议的界面就是我们在贵公司使用的界面。唯一的问题是不是我做的,我只是用它。所以我帮不了你。对不起,我的天啊,非常感谢你的链接!前几句话让我头痛。^^我编辑了我的帖子,以显示正确的代码。但我不能,就在最近+组件移动器为1。省去了我很多麻烦。谢谢,我知道这很旧,但是你知道如何让ComponentMover在多个监视器上工作吗?@Ryan现在不知道,在Java8中也不知道(不能等待与Java6相比的一些更改),是否存在一些问题,然后创建一个新问题,并说明问题,链接到代码库,您的代码和Java版本,事件。对于本机操作系统,也许有人可以测试一下:-)我认为你的答案不正确-首先,你没有提供任何关于使用该代码段的评论,其次,你使用了不同的字母大小。这对我需要做的工作是有效的,足够的,但拖动时鼠标指针偏离了实际组件?有什么想法吗?
int X=E.getX() + button.getX();
int Y=E.getY() + button.getY();