Как я могу реализовать новую функциональность JFrame - PullRequest
3 голосов
/ 21 декабря 2009

Я пытаюсь удалить панель перетаскивания через верх JFrame. Я хотел бы, чтобы параметры минимизации и закрытия были доступны на этой панели. Я думал о том, чтобы убрать панель (и значки). Затем добавьте значки как внедренные изображения, которые реализуют список действий JFrame. Это также необходимо для работы с JInternalFrames. Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

4 голосов
/ 21 декабря 2009

Вы должны сделать шаг назад и понять, как работает Swing.

Когда вы создаете JFrame, Swing использует виджет OS для фрейма. Строка заголовка, которую вы видите, является частью компонента ОС, и у вас нет прямого контроля над ней с помощью Swing. Вы можете скрыть заголовок (и границу) фрейма, используя setUndecorated (false), как предлагалось ранее. В этом случае вы потеряете все функции, связанные со строкой заголовка (перетаскивание и доступ ко всем кнопкам) и границей (изменение размера). Поэтому, если вам нужна какая-либо из этих функций, вам нужно воссоздать все это самостоятельно.

С другой стороны, вы можете использовать:

JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame();

и Swing создаст для вас строку заголовка и Border и добавит обратно все стандартные функции. Поэтому, если вы хотите предотвратить перетаскивание, вам необходимо проверить JFrame на наличие всех его компонентов, чтобы найти компонент, представляющий строку заголовка. Когда вы найдете этот компонент, вы можете удалить MouseMotionListeners из компонента, чтобы предотвратить перетаскивание. Таким образом, строка заголовка все еще будет там, и кнопки будут активны, но перетаскивание будет отключено. Я полагаю, что проще добавить всю функциональность к неокрашенному каркасу.

Как вы уже поняли, JInternalFrame - это компонент, полностью написанный на Swing, поэтому у вас есть доступ к дочерним компонентам, что по сути и является подходом, который я предлагаю для JFrame.

1 голос
/ 22 декабря 2009

Посмотрите на эту статью - я думаю, что это в значительной степени то, что вам нужно для части JFrame.

http://www.stupidjavatricks.com/?p=4

Она основана на JDialog, но должна быть довольнопочти так же, как JFrame.Развернуть / свернуть должно быть почти так же, как кнопка закрытия.

1 голос
/ 21 декабря 2009

Чтобы удалить заголовок, используйте

setUndecorated(true);

Затем вы можете добавить кнопки для увеличения / уменьшения. Исходный код кнопки максимизации может выглядеть примерно так (просто чтобы получить представление). Используйте JFrame.ICONIFIED для кнопки свертывания.

JButton btnMaximize = new JButton("+");
btnMaximize.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        if(MainFrame.this.getExtendedState() == JFrame.MAXIMIZED_BOTH) {
            MainFrame.this.setExtendedState(JFrame.NORMAL);
        }
        else {
            MainFrame.this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        }
    }
});
0 голосов
/ 21 декабря 2009

Для JInternalFrames ...

javax.swing.plaf.InternalFrameUI ifu= this.getUI();
((javax.swing.plaf.basic.BasicInternalFrameUI)ifu).setNorthPane(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...