我正在做一個undecorated JFrame
,所以我需要一種方法來改變窗口的位置。到目前爲止,我可以讓窗戶跟着鼠標,但我不能讓它停下來。我添加了一個ActionPerformed
到JButton
:知道如果沒有聽衆或不同的方法點擊鼠標
test = true;
while (test) {
setLocation(MouseInfo.getPointerInfo().getLocation().x - 20, MouseInfo.getPointerInfo().getLocation().y - 20);
}
偏移量是否有保持JButton
裏面的指針,該圖形看起來while
期間按下。它創造奇蹟,非常快。但我不知道如何讓它停止。我試圖添加一個MouseClicked
,它將test
設置爲false,但它不起作用。顯然,循環運行時沒有Listener工作。
有沒有辦法知道鼠標是否在while
內部被點擊?那麼,沒有聽衆或事件?或者還有另一種重新定位窗口的方法嗎?
編輯:再次
由於尤爾根·卡米萊裏,但我想補充他的榜樣的修改版本,我相信這是簡單的,包含幾乎沒有必要的東西,使這項工作。
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()
上添加一些補償。
我想要的文本之前說「你好」,但在第一提交和兩個編輯我做了,該行消失。讓SO人添加代碼來刪除'你好? – GuiRitter
主要的問題是,你的循環內部的事件分派線程,這將阻止任何新的事件被處理(或重新繪製發生) – MadProgrammer
@MadProgrammer我不知道重繪,因爲正如我所說,我第一次嘗試運行良好,就像在用鼠標移動的框架中一樣,但是要感謝有關事件的通知。 – GuiRitter