移动带有自定义标题栏的JFrame

3
我该如何移动具有自定义标题栏的JFrame
我已经移除了默认的标题栏并且设计了自己的标题栏,展示如图: enter image description here 当光标放在标题栏上而不是整个框架时,我想知道如何拖动JFrame。 我已经搜索过了,看到了很多示例,但还是不理解。 你们有简单的代码可以帮助我理解吗?
我还没有开始写代码,因为我不知道从哪里开始。我只知道涉及到mouseDraggedMouseMotionListener

只需发布图像链接,我就可以将其包含在您的帖子中。 - msrd0
哦,等等。对不起。这里是链接: https://www.dropbox.com/s/nbud87n9losvavg/drag.PNG?dl=0 - Robert
好的,我已经添加了图片。你找到了JFrame.setLocation方法了吗? - msrd0
哎呀,谢谢。 还没有。你知道怎么做吗? - Robert
1
例如:(https://dev59.com/-2Af5IYBdhLWcg3wmzlL#24476755) - Paul Samsotha
显示剩余2条评论
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提供了关键链接拖动和调整大小未装饰的JFrame,并激发了保存mousePressed(...)中鼠标位置的灵感。


1
我试过了。看看发生了什么。https://www.dropbox.com/s/hivv6l331vwpxnp/DragFrame.xesc?dl=0 - Robert
@Robert 很有创意的沟通方式! :-) 这与我上面提到的效果相同。这里使用较小的JFrame [setBounds(100, 100, 400, 300)],但窗口在快速连续绘制在两个不同的位置,看起来像是两个窗口。 - Gerold Broser

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());
    }
}

抱歉,我不太明白。你能再详细解释一下吗?谢谢。 - Robert
我应该怎么处理这个 f 变量? - Robert
@Robert yourFrame.addMouseMotionListener( new FrameMoveListener( yourFrame ) ); 请将此代码添加到您的程序中。 - Gerold Broser
@Robert,按照_Gerold Broser_的建议将你的FrameMoveListener“连接”到你的帧上。如果你不确定f是否为null,你应该在构造函数中添加if (f == null) throw new NullPointerException(); - msrd0

0

使用这个方法非常简单和完美

最终组件对象 - 您的JFrame、JLabel或任何组件 最终布尔值 - 如果您想在释放左键时显示位置信息

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);
    }

谢谢!:D 它起作用了!但这是针对像按钮、文本、背景等对象的,我该如何移动整个框架呢? - Robert
@Robert A JFrame 也是一个组件。一旦您在Frame / ContentPane上有其他组件,请参阅如何使用根窗格,玻璃窗格:“当您想要能够捕获事件时,玻璃窗格非常有用[...]覆盖一个已经包含一个或多个组件的区域。” - Gerold Broser
使用这种方法,您可以移动所有类型的组件。我总是用它来编辑我的元素位置和自定义JFrames。 - WearFox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接