我正在制作一个未修饰的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/