2

我正在制作一个 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().

4

2 回答 2

2

所以我需要一种改变窗口位置的方法。

如需不同的方法,请查看移动窗口

于 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 回答