gpt4 book ai didi

java - 知道鼠标是在没有监听器的情况下单击的,还是不同的方法

转载 作者:行者123 更新时间:2023-12-04 05:04:20 25 4
gpt4 key购买 nike

我正在制作一个未装饰的 JFrame ,所以我需要一种改变窗口位置的方法。到目前为止,我可以让窗口跟随鼠标,但我不能让它停止。我添加了 ActionPerformedJButton :

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

偏移量用于将指针保持在 JButton 内。 ,在 while 期间以图形方式看起来被按下.它的效果非常好,速度非常快。但我不知道如何让它停止。我尝试添加 MouseClicked设置 test为假,但没有奏效。显然,在循环运行时没有监听器工作。

有没有办法知道鼠标是否在那个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com