2

装飾のない を作成JFrame中なので、ウィンドウの位置を変更する方法が必要です。これまでのところ、ウィンドウをマウスに追従させることはできますが、停止させることはできません。に を追加しActionPerformedましたJButton:

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

オフセットは、ポインタを 内に保持するためにありJButtonますwhile。それは非常に速く、驚異的に機能します。しかし、それを止める方法がわかりません。MouseClickedfalse に設定する 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()

4

2 に答える 2

2

そのため、ウィンドウの位置を変更する方法が必要です。

別のアプローチについては、Moving Windowsをご覧ください。

于 2013-03-30T15:32:34.650 に答える
1

これを試して:

public class UndecoratedJFrame extends JFrame {

    Point origin;
    Point origin2;

    public UndecoratedJFrame() {
        setUndecorated(true);
        initComponents();

        setVisible(true);
    }

    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                formMousePressed(evt);
            }
        });

        addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                formMouseDragged(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
        );

        layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }                      

    private void formMouseDragged(java.awt.event.MouseEvent evt) {                                  
        origin2 = new Point(evt.getLocationOnScreen());
        setLocation((int)(origin2.getX() - origin.getX()), (int)(origin2.getY() - origin.getY()));
    }                                 

    private void formMousePressed(java.awt.event.MouseEvent evt) {                                  
       origin = new Point(evt.getPoint());
    }
}
于 2013-03-30T15:34:34.323 に答える