Использование JPanel контейнера панели

При построении интерфейсов нужны компоненты-контерйнеры, которые будут содержать другие компоненты пользовательского интерфейса. В Swing одним из таких компонентов-контейнеров является JPanel. По умолчанию JPanel сама по себе ничего не отрисовывает за исключением фона. При работе с контейнерами, разработчику надо решить, как правило, две основные проблемы. Первая – задать расположение дочерних компонентов и вторая – осуществить добавление компонентов на контейнер.

Рассмотрим первую проблему – задание расположения дочерних компонентов. В Swing имеется механизм Layout Manager’ов для задания структуры расположения дочерних компонентов на контейнере. Кроме того Layout Manager определяет то, как будут реагировать компоненты на изменение размеров родительского контейнера. Задается Layout Manager для контейнера с помощью метода setLayout. Вторая проблема – добавление компонента. Добавление компонента выполняется с помощью метода add. В качестве параметров этому методу передается добавляемый компонент, а также и другие объекты, отвечающие за расположение компонента. Рассмотрим пример панели, которая в качестве Layout Manager’а будет использовать Border Layout.

using_jpanel

Исходный код представлен ниже.

import java.awt.BorderLayout;
import java.awt.Dimension;

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

public class Test {
     
     public static void createGUI() {
          JFrame.setDefaultLookAndFeelDecorated(true);
          JFrame frame = new JFrame(«Test frame»);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);          
     
          JPanel panel = new JPanel();
          panel.setLayout(new BorderLayout());
          
          JButton northButton = new JButton(«North»);
          panel.add(northButton, BorderLayout.NORTH);
          
          JButton southButton = new JButton(«South»);
          panel.add(southButton, BorderLayout.SOUTH);
          
          JButton eastButton = new JButton(«East»);
          panel.add(eastButton, BorderLayout.EAST);
          
          JButton westButton = new JButton(«West»);
          panel.add(westButton, BorderLayout.WEST);
          
          JButton centerButton = new JButton(«Center»);
          panel.add(centerButton, BorderLayout.CENTER);
          
          frame.getContentPane().add(panel);          
          frame.setPreferredSize(new Dimension(500, 400));
          
          frame.pack();
          frame.setVisible(true);
          frame.setLocationRelativeTo(null);
     }
     
     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    createGUI();
               }
          });
     }
}

Как было сказано выше для того, чтобы задать у панели Layout Manager используется метод setLayout. В данном примере ему передается ссылка на только что созданный BorderLayout, но это может быть и FlowLayout к примеру или какой-то другой лейаут. Какие существуют еще Layout Manager’ы в Swing’е думаю рассмотреть потом. Если обратиться к методу setLayout, то окажется, что он принимает в качестве параметра любой класс, который будет реализовывать интерфейс LayoutManager. Поэтому при желании можно самому создать свой лейаут. Так, лейаут у компонента задан идем дальше. Далее мы создаем комопненты, которые хотим увидеть на панели, в данном случае кнопки. При помощи метода add добавляем их на панель. При вызове метода add мы передаем туда два параметра. Первый параметр – это компонент, который хотим добавить, второй – некие constraints, которые задают расположение компонента при данном лейауте. Например мы выбрали BorderLayout. Это значит, что вся панель условно разделится на 5 частей – север (north), юг (south), запад (west), восток (east) и центер (center). Поэтому при добавлении компонента, мы говорим, в каком регионе хотим его видеть. Если в центре, то в качестве constraints передаем константу BorderLayout.CENTER, если на севере, то BorderLayout.NORTH и так далее.

2 Responses to Использование JPanel контейнера панели

  1. Рамиль:

    Зачем метод Pack()? И зачем отельный поток, если можно инициировать frame в методе main(), а потом установить setVisible(true)?

  2. Alik:

    Как обратиться к JButton по имени(Name) созданой в цикле, для того чтобы присвоить её какие то значения..не важно скажем изменить текст, цвет?

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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