我正在制作一个 undecorated JFrame
,所以我需要一种方法来更改窗口位置。到目前为止,我可以让窗口跟随鼠标,但我不能让它停止。我添加了ActionPerformed
一个JButton
:
test = true;
while (test) {
setLocation(MouseInfo.getPointerInfo().getLocation().x - 20, MouseInfo.getPointerInfo().getLocation().y - 20);
}
偏移量用于将指针保持在 内JButton
,在while
. 它的效果非常好,速度非常快。但我不知道如何让它停止。我尝试添加一个MouseClicked
设置test
为 false 的值,但没有成功。显然,在循环运行时没有监听器工作。
有没有办法知道鼠标是否在其中被点击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) {}
}
不要介意空的覆盖方法,它们是必要的。在我正在开发的实际程序中,我为侦听器使用了一个单独的类,它也同样有效。此外,您是实现侦听器还是扩展适配器似乎并不重要。一方面,您可以实现这两个接口。另一方面,您不需要重写扩展抽象类的所有方法。
此外,如果您将侦听器添加到框架的容器中,此方法也有效。但是,它将表现得好像该容器位于 (0, 0) 处。您必须在setLocation()
.