JFrame – сворачиваем, разворачиваем и закрываем

Как каждое нормальное окно, JFrame имеет кнопки для управления размерами окна, а также для его закрытия. Эти кнопки располагаются в правом верхнем углу заголовка окна JFrame. Здесь есть кнопка минимизации окна, при нажатии на которую окно сворачивается. Имеется кнопка максимизации размеров окна, когда JFrame разворачивается на весь экран. Как только окно развернуто, появляется кнопка возврата к «нормальному» размеру окна до разворачивания. Ну и последняя кнопка – это закрытие окна. Интересно то, что для выполнения этих задач разработчик может использовать специальные методы JFrame. Рассмотрим, как можно сворачивать, разворачивать и закрывать окно, используя эти методы.

Для того, чтобы свернуть окно, используется метод setState с параметром JFrame.ICONIFIED. Чтобы развернуть окно на весь дисплей вызывается метод setExtendedState с параметром JFrame.MAXIMIZED_BOTH. Для восстановления нормального размера после того, как окно было развернуто, вызываем всё тот же setExtendedState, но только с параметром JFrame.NORMAL. Далее в случае, если потребуется скрыть окно, используем setVisible с параметром false. Если окно, которое мы хотим скрыть, является главным окном приложения, то при скрытии окна потребуется осуществить выход из приложения. Например, у нас есть пункт главного меню «Выход», при выборе которого нужно выйти из приложения, то тогда можно сразу вызвать System.exit(0).

Ну и для демонстрации вышеописанных методов предлагаю код приложения, внешний вид которого представлен на рисунке.

jframe_resizing

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestFrame {

     public static void createGUI() {
          JFrame.setDefaultLookAndFeelDecorated(true);
          final JFrame frame = new JFrame(«Test frame»);
                    
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          JPanel panel = new JPanel();
          panel.setLayout(new FlowLayout());

          JButton minButton = new JButton(«Minimize»);          
          minButton.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                    frame.setState(JFrame.ICONIFIED);                                        
               }
          });
          panel.add(minButton);

          JButton maxButton = new JButton(«Maximize»);          
          maxButton.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);                    
               }
          });
          panel.add(maxButton);

          JButton normalButton = new JButton(«Normal»);          
          normalButton.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                    frame.setExtendedState(JFrame.NORMAL);                                        
               }
          });
          panel.add(normalButton);
          
          JButton exitButton = new JButton(«Exit»);          
          exitButton.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                    frame.setVisible(false);
                    System.exit(0);
               }
          });
          panel.add(exitButton);

          frame.getContentPane().add(panel);
          frame.setPreferredSize(new Dimension(400, 80));
          
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
     }

     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    createGUI();
               }
          });
     }
}

Advertisements

5 Responses to JFrame – сворачиваем, разворачиваем и закрываем

  1. Kichrum says:

    Спасибо! Полезно. А как бы повесить экшнлистенер на стандартную кнопку сворачивания?

  2. egor says:

    А что это за метод frame.setLocationRelativeTo(null);
    и для чего это javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {

    • Anatoliy says:

      1) frame.setLocationRelativeTo(null); указывает расположение фрейма на экране.
      2) SwingUtilities.invokeLater(new Runnable() {public void run() { ; Разработчики java настоятельно рекомендуют выполнять действия в специальных потоках. Поэтому и был использован этот подход. Конечно можно создать фрейм и в потоке main, но нету гарантий, что выполняемые действия будут корректно исполнятся.

      Можно и так:

      public static void main(String[] args) {
      createGUI();
      }

      Но рекомендуется так:

      public static void main(String[] args){
      SwingUtilities.invokeLater(new Runnable() {
      public void run() {
      MainGUI frame = new MainGUI();
      }
      });
      }

  3. Сергей says:

    Привет всем! Хорошая статья! Как раз искал и первое на что напоролся это она. Очень помогла сократить время на поиски. Пишу почтовый клиет для gmail и требовалось полностью свой интерфейс, включая рамку окна со всем функционалом.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: