装飾のない を作成JFrame
中なので、ウィンドウの位置を変更する方法が必要です。これまでのところ、ウィンドウをマウスに追従させることはできますが、停止させることはできません。に を追加しActionPerformed
ましたJButton
:
test = true;
while (test) {
setLocation(MouseInfo.getPointerInfo().getLocation().x - 20, MouseInfo.getPointerInfo().getLocation().y - 20);
}
オフセットは、ポインタを 内に保持するためにありJButton
ますwhile
。それは非常に速く、驚異的に機能します。しかし、それを止める方法がわかりません。MouseClicked
false に設定する a を追加しようとしました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) {}
}
空のオーバーライドされたメソッドを気にしないでください。それらは必要です。私が開発していた実際のプログラムでは、リスナー用に別のクラスを使用しましたが、これも同様に機能します。また、Listener を実装するか、Adapter を拡張するかは問題ではないようです。一方では、両方のインターフェイスを実装できます。一方、拡張抽象クラスのすべてのメソッドをオーバーライドする必要はありません。
また、この方法は、リスナーをフレームのコンテナーに追加する場合にも機能します。ただし、そのコンテナが (0, 0) にあるかのように動作します。にいくつかのオフセットを追加する必要がありますsetLocation()
。