Интернет-технологии Основы JAVA Модуль : Графический интерфейс пользователя (GUI) Роль Swing Технология Swing - это GUI Java-платформы. Swing реализует шаблон проектирования c основными принципами GUI: Модель-Представление-Контроллер (Model-View-Controller - MVC) Модель задает состояние компонента. Например, для флажка опций модель содержит признак того, установлен или сброшен флажок. Представление определяет, как компонент будет отображаться на экране, в том числе как будет представлено текущее состояние модели. Контроллер обеспечивает реакцию компонента на действия пользователя. Контейнеры Контейнеры верхнего уровня JFrame, JApplet, JWindow , JDialog и др. Контейнеры второго уровня - потомки JComponent такие как JPanel и др. Обзор простых Swing-виджетов JLabel – метка JButton – кнопка JTextField – текстовое поле JFrame – фрэйм или контейнер верхнего уровня JComboBox – ниспадающий список JCheckBox/JRadioButton – варианты для выбора JMenu/JMenuItem/JMenuBar – системы меню JTextArea – несколько строк JList – варианты для выбора JTable – электронная таблица JMenuBar Первая программа import javax.swing.*; import javax.swing.*; public class SwingMy { public static void main(String[] args) { JFrame jfrm = new JFrame("A simple swing program"); jfrm.setSize (300, 200); jfrm.setLocation (100, 200); jfrm.setVisible (true); } } Добавляем кнопку import javax.swing.*; public class SwingMy { public static void main(String[] args) { JFrame jfrm = new JFrame("A simple swing program"); jfrm.setSize (300, 200); // установка положения фрейма jfrm.setLocation (100, 200); jfrm.setVisible (true); JButton jbtn = new JButton("КНОПКА"); jbtn.setSize(120,50); //а размеры не установились? jfrm.add(jbtn); //добавляем кнопку на форму } } Диспетчер компоновки Layout Manager import java.awt.*; FlowLayout – рисует в строку все компоненты в том порядке, в котором они были помещены в контейнер. Если места в строке не хватает, то переносит компоненты на другую строку. При изменении размера формы расположение кнопок будет меняться Самый простой layout manager JFrame jfrm = new JFrame("A simple swing program"); //………………………………………….. JPanel jpan = new JPanel(); //Панель содержимого jpan.setLayout ( new FlowLayout() ); for (int i=0; i<5; i++) { jpan.add(new JButton("Button "+ i)); } jfrm.add(jpan); jfrm.setVisible(true); Диспетчер компоновки Layout Manager По умолчанию с панелью содержимого связан диспетчер BorderLayout. BorderLayout – Компоненты располагаются в пяти областях: центр, север, юг, запад, восток. Приоритеты компонентов: 1)север, 2)юг, 3) восток, 4)запад , 5)центр (занимает все оставшееся пространство) //………………………………………….. JPanel jpan = new JPanel(); jpan.setLayout (new BorderLayout()); jpan.add(new JButton("North"), BorderLayout.NORTH); jpan.add(new JButton("South"), BorderLayout.SOUTH); jpan.add(new JButton("West"), BorderLayout.WEST); jpan.add(new JButton("East"), BorderLayout.EAST); jpan.add(new JButton("Center"), BorderLayout.CENTER); //………………………………………….. Диспетчер компоновки Layout Manager BoxLayout – позволяет располагать компоненты вдоль одной из осей – вертикально или горизонтально (PAGE_AXIS, LINE_AXIS или Х_AXIS, Y_AXIS). В конструкторе указывается, какой вариант использовать . JPanel jpan = new JPanel(); jpan.setLayout (new BoxLayout(jpan, BoxLayout.Y_AXIS)); for (int i=0; i<5; i++) { jpan.add(new JButton("Button "+ i)); } JPanel jpan = new JPanel(); jpan.setLayout (new BoxLayout(jpan, BoxLayout.Х_AXIS)); for (int i=0; i<5; i++) { jpan.add(new JButton("Button "+ i)); } Диспетчер компоновки Layout Manager GridLayout – располагает компоненты в гриде (таблице). //………………………………………….. JPanel jpan = new JPanel(); jpan.setLayout ( new GridLayout(4, 3, 10, 10) ); /* кол-во строк, столбцов, расстояние по ширине между элементами и -//- по высоте*/ for (int i=0; i<12; i++) { jpan.add(new JButton("Button "+ i)); }//………………………………………….. //………………………………………….. JPanel jpan = new JPanel(); jpan.setLayout ( new GridLayout(4, 3, 20, 5) ); for (int i=0; i<12; i++) { jpan.add(new JButton("Button "+ i)); }//………………………………………….. Установка размера компонента По умолчанию размер компонента определяется его содержимым, и зависит от используемого диспетчера компоновки. Можно явно указать предпочтительный размер компонента вызвав метод setPreferredSize(Dimension newPS) , где класс Dimension (int w, int h) задает w – ширину и h – высоту import java.awt.Dimension; //………………………………………….. JPanel jpan = new JPanel(); JButton btn = new JButton("Размер 180х50"); btn.setPreferredSize(new Dimension(180,50)); jpan.add(btn); //………………………………………….. //………………………………………….. JPanel jpan = new JPanel(); JButton btn = new JButton("Размер 220х100"); btn.setPreferredSize(new Dimension(220,100)); jpan.add(btn); //………………………………………….. Создание объекта Swinq в потоке обработки событий Подавляющее большинство Swing - программ управляется событиями. Обработчик события выполняется в специальном потоке обработки событий, формируемом Swing, а не в главном потоке приложения. Во избежание проблем (связанных, например, с попытками двух потоков одновременно обновить один и тот же компонент), все элементы пользовательского интерфейса Swing должны создаваться не в основном потоке приложения, а в потоке обработки событий. Однако метод main () выполняется в основном потоке. Следовательно, в нем нельзя непосредственно создавать объект Swing. Следует создать объект Runnable выполняемый в потоке обработки событий и предоставить данному объекту возможность создать окно интерфейса программы. Для создания кода в потоке обработки событий, надо использовать один из двух методов, определенных в классе SwingUtilities: invokeLater () или invokeAndWait (). static void invokeLater(Runnable obj); сразу возвращает управление вызывающему методу static void invokeAndWait(Runnable obj); ожидает завершения метода оbj run (). где obj - объект Runnable, метод run () которого вызывается в потоке обработки событий. Создание объекта Swinq в потоке обработки событий import javax.swing.*; public class firstSw { public firstSw() { // Создание контейнера веpxнегo уровня JFrame jfrm = new JFrame("А Simple Swinq "); jfrm.setSize(275, 100); // Установка начальних размеров фрейма // Завершение работы программы при закрытии окна jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel jlab = new JLabel("Swiq Java GUI."); // Создание метки jfrm.add(jlab); // Включение метки в состав фрейма jfrm.setVisible(true); // отображение фрейма } public static void main(String[] args) { // Создание фрейма в потоке обработки событий SwingUtilities.invokeLater(new Runnable() { public void run() { new firstSw(); } } } }); Еще один способ создания объекта Swinq import javax.swing.*; public class SimpleSwing extends JFrame { public SimpleSwing() { super(); //вызывает конструктор суперкласса this.setSize(300, 200); this.setLayout(null); this.add(getJTextField(), null); this.add(getJButton(), null); this.setTitle("HelloWorld"); } private JTextField getJTextField() { JTextField jTextField = new JTextField(); jTextField.setBounds(96, 49, 160, 20); return jTextField; } private JButton getJButton() { JButton jButton = new JButton(); jButton.setBounds(103, 110, 100, 27); jButton.setText("OK"); return jButton; } public static void main(String[] args) { SimpleSwing w = new SimpleSwing(); w.setVisible(true); } } Создание меню JMenu/JMenuItem/JMenuBar Основой системы меню является JMenuBar JMenu используется для содержания других JMenuItem и Jmenu JMenuItem при выборе активизирует действие JMenu JMenuItem Создание меню import javax.swing.*; public class menu { private JMenuBar menuBar; public JMenuBar getMenuBar(){ return menuBar; } public menu() { menuBar = new JMenuBar(); JMenu menuFile = new JMenu("File"); JMenuItem fileOpen = new JMenuItem("File Open"); JMenuItem fileClose = new JMenuItem("File Close"); menuFile.add(fileOpen); menuFile.add(fileClose); menuBar.add(menuFile); JMenu menuEdit = new JMenu("Edit"); JMenuItem editCopy = new JMenuItem("Copy"); JMenuItem editPaste = new JMenuItem("Paste"); menuEdit.add(editCopy); menuEdit.add(editPaste); menuBar.add(menuEdit); } } Создание меню import javax.swing.*; public class firstSw { public firstSw() { JFrame jfrm = new JFrame("А Simple Swinq Proqram"); jfrm.setSize(275, 100); jfrm.setLocation(100, 200); jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); menu firstMenu = new menu(); jfrm.setJMenuBar(firstMenu. getMenuBar()); jfrm.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new irstSw(); } }); } }