2

如何移动JFrame具有自定义标题栏?

我删除了默认的标题栏,我做了自己的设计。这是它的样子:

在此处输入图像描述

我想知道JFrame当光标仅放在标题栏而不是整个框架上时如何拖动。我已经搜索过了,我已经看到了很多样本​​,但我仍然不明白。你们有任何我能理解的简单代码吗?

我还没有启动代码,因为我不知道如何启动它。我所知道的是,它是关于mouseDraggedor MouseMotionListener

4

3 回答 3

1

我实现了以下内容:

public class DragFrame extends JFrame {

  int mpX, mpY;

  public DragFrame() {

    addMouseListener( new MouseAdapter() {
        @Override
        public void mousePressed( MouseEvent e ) {
          mpX = e.getX();
          mpY = e.getY();
        }
    } );

    addMouseMotionListener( new MouseMotionAdapter() {
        @Override
        public void mouseDragged( MouseEvent e ) {
          setLocation(
              getLocation().x + e.getX() - mpX,
              getLocation().y + e.getY() - mpY );
        }
    } );
  }
}

感谢@peeskillet提供了Drag and Resize undecorated JFrame的关键链接,并提供了将鼠标位置保存在mousePressed(...).

于 2014-10-11T22:43:45.857 回答
0

使用这种方法简单而完美

final Component obj - 你的 JFrame、JLabel、任何 Component 最终布尔信息 - 如果你想在释放左键时显示位置

public static void Move(final Component obj,final boolean info) {

        MouseInputAdapter d=new MouseInputAdapter() {int x,X,y,Y;
        @Override public void mousePressed(MouseEvent e){if(SwingUtilities.isLeftMouseButton(e)){x=e.getXOnScreen();X=obj.getLocation().x;y=e.getYOnScreen();Y=obj.getLocation().y;}}
        @Override public void mouseDragged(MouseEvent e){if(SwingUtilities.isLeftMouseButton(e)){obj.setLocation(X+(e.getXOnScreen()-x), Y+(e.getYOnScreen()-y));}}
        @Override public void mouseReleased(MouseEvent e){if(info && SwingUtilities.isLeftMouseButton(e)){System.err.println(obj.toString().substring(0,obj.toString().indexOf("["))+" ("+obj.getLocation().x+","+obj.getLocation().y+")");}}};
        obj.addMouseListener(d);obj.addMouseMotionListener(d);
    }

这是格式代码:

public static void Mover(final Component obj, final boolean info) {

        MouseInputAdapter d = new MouseInputAdapter() {
            int x, X, y, Y;

            @Override public void mousePressed(MouseEvent e) {
                if (SwingUtilities.isLeftMouseButton(e)) {
                    x = e.getXOnScreen();
                    X = obj.getLocation().x;
                    y = e.getYOnScreen();
                    Y = obj.getLocation().y;
                }
            }
            @Override public void mouseDragged(MouseEvent e) {
                if (SwingUtilities.isLeftMouseButton(e)) {
                    obj.setLocation(X + (e.getXOnScreen() - x), Y + (e.getYOnScreen() - y));
                }
            }
            @Override public void mouseReleased(MouseEvent e) {
                if (info && SwingUtilities.isLeftMouseButton(e)) {
                    System.err.println(obj.toString().substring(0, obj.toString().indexOf("[")) + " (" + obj.getLocation().x + "," + obj.getLocation().y + ")");
                }
            }
        };
        obj.addMouseListener(d);
        obj.addMouseMotionListener(d);
    }
于 2014-10-11T22:47:45.957 回答
0

您需要覆盖该MoseMotionListener.mouseDragged方法的猜测是正确的。然后,您需要调用JFrame.setLocation以移动您的JFrame,如下所示:

class FrameMoveListener extends MouseAdapter
{
    private Point lastPos;
    private Frame frame;

    public FrameMoveListener (Frame f)
    {
        frame = f; // mustn't be null
    }

    public void mouseDragged (MouseEvent evt)
    {
        if (lastPos != null)
        {
            int x = lastPos.x - evt.getX();
            int y = lastPos.y - evt.getY();
            f.setLocation(f.getLocationOnScreen().x + x,
                          f.getLocationOnScreen().y + y);
        }
        lastPos = new Point(evt.getX(), evt.getY());
    }
}
于 2014-10-11T19:53:04.703 回答