java - 了解是否在没有监听器的情况下单击了鼠标,或者采用了不同的方法

标签 java swing location mouseevent actionlistener

我正在制作一个未修饰的JFrame,所以我需要一种方法来更改窗口位置。到目前为止,我可以让窗口跟随鼠标,但无法让它停止。我将 ActionPerformed 添加到 JButton:

test = true;
while (test) {
    setLocation(MouseInfo.getPointerInfo().getLocation().x - 20, MouseInfo.getPointerInfo().getLocation().y - 20);
}

偏移量的作用是将指针保持在 JButton 内,从图形上看,该指针在 while 期间被按下。它的效果非常好,速度非常快。但我不知道如何让它停止。我尝试添加一个将 test 设置为 false 的 MouseClicked,但没有成功。显然,循环运行时没有监听器在工作。

有没有办法知道鼠标是否在该 while 内被单击?那么,没有监听器或事件吗?还是有另一种方法来重新定位窗口?

编辑:

再次感谢 Jurgen Camilleri,但我想添加他的示例的修改版本,我认为该版本更简单,包含使这项工作几乎必需的内容。

package testbench;

import java.awt.EventQueue;
import java.awt.HeadlessException;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class DraggableFrame
 extends JFrame
 implements MouseListener, MouseMotionListener {

    static Point dragged = null;
    static Point pressed = null;

    public DraggableFrame () throws HeadlessException {
        addMouseListener(this);
        addMouseMotionListener(this);
        setBounds(0, 0, 320, 240);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setUndecorated(true);
    }

    public static void main (String args[]) {        
        EventQueue.invokeLater(new Runnable () {
            @Override
            public void run () {
                new DraggableFrame().setVisible(true);
            }
        });
    }

    @Override
    public void mouseClicked (MouseEvent e) {}

    @Override
    public void mouseDragged (MouseEvent e) {
        dragged = e.getLocationOnScreen();
        setLocation(
         (int)(dragged.getX() - pressed.getX()),
         (int)(dragged.getY() - pressed.getY()));
    }

    @Override
    public void mouseEntered (MouseEvent e) {}

    @Override
    public void mouseExited (MouseEvent e) {}

    @Override
    public void mouseMoved (MouseEvent e) {}

    @Override
    public void mousePressed (MouseEvent e) {
        pressed = e.getPoint();
    }

    @Override
    public void mouseReleased (MouseEvent e) {}
}

不要介意空的重写方法,它们是必要的。在我开发的实际程序中,我为监听器使用了一个单独的类,效果也很好。另外,无论您实现监听器还是扩展适配器,似乎都不重要。一方面,您可以实现这两个接口(interface)。另一方面,您不需要重写扩展抽象类的所有方法。

此外,如果您将监听器添加到框架的容器中,此方法也适用。但是,它的行为就像该容器位于 (0, 0) 处一样。您必须在 setLocation() 上添加一些偏移量。

最佳答案

so I need a way to change the window position.

要了解不同的方法,请查看 Moving Windows .

关于java - 了解是否在没有监听器的情况下单击了鼠标,或者采用了不同的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15719745/

相关文章:

android - getLastKnownLocation 不适用于 Samsung Galaxy S3 4.0.4

PHP MySQL从GPS获取半径用户位置的位置

java - 如何在 Java 中解析基本查询(类似于 Google 数据)?

java - 在编译时未评估的接口(interface)中定义的最终静态字符串 - Android

java - While 循环按预期多执行一次

java - 使用 gson 反序列化嵌套的泛型类

java - 如何唤醒等待中的SwingWorker?

java - GUI 中的 JButton

java - 从 JTextArea 获取一个键

c++ - Visual Studio 显示错误的 SEH 异常位置