如何给没有标题栏的JFrame添加拖动功能?

4
我正在创建一个带有四个按钮的JFrame窗口。这些按钮位于标题栏中。
JFrame frame=new JFrame("custom JFrame with 4 buttons in title");
frame.setUndecorated(true);

JPanel button_panel=new JPanel(new FlowLayout(FlowLayout.LEFT));
JButton button_1=new JButton("+");
JButton button_2=new JButton("↑");
JButton button_3=new JButton("-");
JButton button_4=new JButton("system tray");

button_panel.add(button_1);
button_panel.add(button_2);
button_panel.add(button_3);
button_panel.add(button_4);

frame.getContentPane().add(button_panel,BorderLayout.NORTH);

现在,我有一个带有四个按钮的JFrame。

但是,如何为这个自定义JFrame提供拖动功能呢?


您希望如何移动JFrame?类似于单击框架中的任何内容,然后拖动鼠标吗? - user489041
仅返回顶部按钮面板,用于拖动目的。 - Lokesh Kumar
5个回答

5

这是唯一的解决方案吗?

嗯,我所知道的唯一解决方案是使用MouseListeners。

如果您需要更通用的解决方案,可以查看移动窗口,它允许您使任何Swing组件可拖动。


2

您是否使用 Mac OS X?针对 Mac 的解决方案如下:

frame.getRootPane().putClientProperty("apple.awt.draggableWindowBackground", true);

1
如果您不关心鼠标位置和屏幕上组件位置之间的偏移量(组件左上角),那么这是最简单的解决方案:
private class DragListener extends MouseAdapter {

   @Override
    public void mouseDragged(MouseEvent e) {
        setLocation(MouseInfo.getPointerInfo().getLocation());
    }
}

1

您可以通过适当设置MouseListener来拖动JFrame的内容。此帖子有一个示例。


@Lokesh 这是我能想到的最简单的方法。你有其他想尝试的方法吗? - Bala R
@@Bala R,我们能否从JFrame UI中提取titlbar组件并在其中添加一个Jbutton。 - Lokesh Kumar

0
您可以像下面这样简单地覆盖mousepressed和mousedragged方法:
private int tx, ty;
private void titlebar_mousePressed(MouseEvent m)
{
    tx= m.getX();
    ty=m.getY();
}
private void titlebar_mouseDragged(MouseEvent m)
{
    titlebar.setLocation(m.getXOnScreen() -tx, m.getYOnScreen() -ty);
}

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