如何在没有标题栏的情况下为JFrame提供拖动功能?

时间:2011-03-31 19:59:56

标签: java swing jframe drag

我在titleBar中创建了一个带有四个按钮的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提供拖动功能?

5 个答案:

答案 0 :(得分:5)

  

它是唯一的解决方案吗?

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

对于更通用的解决方案,您可以查看Moving Windows,它允许您拖动任何Swing组件。

答案 1 :(得分:2)

您使用的是Mac OS X吗?特定于Mac的解决方案就是:

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

答案 2 :(得分:1)

您可以通过适当地设置MouseListener来拖动JFrame的内容。 This post有一个例子。

答案 3 :(得分:1)

如果您不关心屏幕上鼠标位置和组件位置之间的偏移(组件左上角),这是最简单的解决方案:

private class DragListener extends MouseAdapter {

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

答案 4 :(得分: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);
}`