как дать функциональность перетаскивания JFame без заголовка?

Я создаю 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?


person Lokesh Kumar    schedule 31.03.2011    source источник
comment
Как вы хотите, чтобы JFrame перемещался? Что-то типа кликнуть что-нибудь в ламе, а потом перетащить мышкой?   -  person user489041    schedule 01.04.2011
comment
нет.. только верхняя панель button_panel для перетаскивания   -  person Lokesh Kumar    schedule 01.04.2011
comment
Возможный дубликат создание поворотной рамки java подвижной и setUndecorated   -  person    schedule 23.06.2019


Ответы (5)


это единственное решение?

Что ж, единственное известное мне решение — использовать MouseListeners.

Для более общего решения вы можете проверить Перемещение Windows, которое позволяет вам чтобы сделать любой компонент Swing перетаскиваемым.

person camickr    schedule 31.03.2011

Вы используете Mac OS X? Решение для Mac следующее:

frame.getRootPane().putClientProperty("apple.awt.draggableWindowBackground", true);
person Steve McLeod    schedule 01.04.2011

Вы можете перетаскивать JFrame по его содержимому, соответствующим образом настроив MouseListener. В этом сообщении есть пример.

person Bala R    schedule 31.03.2011
comment
@Lokesh, это самое простое, что я могу придумать. У вас был другой подход, который вы хотели попробовать? - person Bala R; 01.04.2011
comment
@@Bala R можем ли мы извлечь компонент заголовка из пользовательского интерфейса JFrame и добавить в него еще одну кнопку Jbutton. - person Lokesh Kumar; 01.04.2011

Если вас не волнует смещение между положением мыши и расположением компонентов на экране (компоненты в верхнем левом углу), это самое простое решение:

private class DragListener extends MouseAdapter {

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

Вы можете просто переопределить методы mousepressed и mousedrag, как показано ниже:

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);
}
person GAURAV ROZATKAR    schedule 07.01.2017