Лекция 09. GUI.Swing ####################################################################################### Введение =========================================================== Пакеты `````````````````````````````````````````````````````````` Для построения GUI в Java используются следующие основные пакеты: #. **Awt** - появился в первых версиях, используется мало. #. **Swing** - самый популярный пакет. #. **JavaFX** - современный и перспективный. Awt пример `````````````````````````````````````````````````````````` .. image:: _static/09/awt-overview.png Swing пример `````````````````````````````````````````````````````````` .. image:: _static/09/swing-overview.png JavaFX пример `````````````````````````````````````````````````````````` .. image:: _static/09/fx-sample.png Сравнение `````````````````````````````````````````````````````````` Недостатки **awt**: * ''тяжеловесные'' компоненты (системозависимые); * невозможность изменения внешнего вида. Недостатки **swing**: * ограничения в изменении внешнего вида; * ориентация на desktop-приложения. Swing =========================================================== Основы ----------------------------------------------------------- Простое приложение `````````````````````````````````````````````````````````` Рассмотрим простейшее **Swing**-приложение. .. code-block:: java import javax.swing.*; public class Simple { public static void main (String [] args) { JFrame myWindow = new JFrame("Пробное окно"); myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); myWindow.setSize(400, 300); myWindow.setVisible(true); } } Контейнеры верхнего уровня `````````````````````````````````````````````````````````` Все **swing**-программы должны включать в себя **Контейнеры первого уровня** * **JFrame** * **JApplet** * **JWindow** * **JDialog** Эти контейнеры находятся на вершине иерархии контейнеров и содержат в себе другие, ''легковесные'' контейнеры и элементы управления. Разница между **JFrame** и **JWindow** может быть показана на следующем примере: .. code-block:: java import javax.swing.*; public class Simple { public static void main (String [] args) { JFrame win1 = new JFrame("JFrame"); win1.setSize(400, 300); win1.setLocation(10,10); JWindow win2 = new JWindow(); win2.setSize(200,300); win2.setLocation(500,200); win1.setVisible(true); win2.setVisible(true); } } Окно **JFrame**, в отличие от **JWindow** обладает заголовком, кнопками управления. Обработка событий ----------------------------------------------------------- События `````````````````````````````````````````````````````````` Рассмотрим пример с обработкой события: .. code-block:: java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Simple { public static void main (String [] args) { JFrame myWindow = new JFrame("Пробное окно"); myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); myWindow.setSize(400, 300); myWindow.setLayout(new FlowLayout()); JButton btn1 = new JButton("Привет!"); JButton btn2 = new JButton("Пока!"); .. code-block:: java btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { JOptionPane.showMessageDialog(null,"Привет","Нажато", JOptionPane.WARNING_MESSAGE); } }); myWindow.add(btn1); myWindow.add(btn2); myWindow.setVisible(true); } } Для размещения кнопок в окне приложения мы должны использовать **менеджеры компоновки**: * **BorderLayout** * **FlowLayout** * **GridLayout** * **GridBagLayout** * **BoxLayout** * **CardLayout** * **GroupLayout** * **SpringLayout** Обзор компонентов ----------------------------------------------------------- Button `````````````````````````````````````````````````````````` Класс **JButton** .. code-block:: java JButton btn = new JButton("Title"); .. code-block:: java JButton(Icon); JButton(String); JButton(String,Icon); .. code-block:: java protected static ImageIcon createImageIcon(String path) { java.net.URL imgURL = ButtonDemo.class.getResource(path); return new ImageIcon(imgURL); } .. ImageIcon ic = createImageIcon("images/icon1.gif"); JButton btn1 = new JButton(ic); .. TextField `````````````````````````````````````````````````````````` .. code-block:: java JTextField(int cols); JTextField(String str,int cols); JTextField(String str); .. code-block:: java textfield.addActionListener(this); .. public void actionPerformed(ActionEvent evt) { String text=textfield.getText(); .. textfield.setText("Новый текст"); .. } Password `````````````````````````````````````````````````````````` .. code-block:: java .. private static String OK = "ok"; .. passfield = new JPasswordField(10); passfield.setActionCommand(OK); passfield.setActionListener(this); .. btn.setActionCommand(OK); .. public void setActionPerformed(ActionEvent evt) { String cmd = ebv.getActionCommand(); if(OK.equals(cmd)) { char[] pass=passfield.getPassword(); .. } } TextArea `````````````````````````````````````````````````````````` .. code-block:: java text = new JTextArea(); .. text.setColumns(20); text.setLineWrap(true); text.setRows(5); text.setEditable(true); .. text.getText(); text.setText("..."); .. CheckBox `````````````````````````````````````````````````````````` .. code-block:: java check = new JCheckBox("Photo"); check.setSelected(true); .. check.addItemListener(new ItemListener() { public void itemStateChanged(ItemIvent e) { if(check.isSelected())... } } RadioButton `````````````````````````````````````````````````````````` .. code-block:: java private static String RED="Red"; private static String BLUE="Blue"; .. rbColorRed = new JRadioButton(RED); rbColorBlue = new JRadioButton(BLUE); rbColorRed.setActionCommand(RED); rbColorBlue.setActionCommand(BLUE); rbColorRed.setSelected(true); .. ButtonGroup group = new ButtonGroup(); group.add(rbColorRed); group.add(rbColorBlue); .. rbColorRed.addActionListener(this); rbColorBlue.addActionListener(this); .. public void actionPerformed(ActionEvent e) { picture.setIcon(new ImageIcon("images/" + e.getActionCommand() + ".gif")); } Dialogs ----------------------------------------------------------- MessageBox `````````````````````````````````````````````````````````` .. code-block:: java import javax.swing.JOptionPane public class ClassNameHere { public static void infoBox(String infoMessage, String titleBar) { JOptionPane.showMessageDialog(null, infoMessage, "InfoBox: " + titleBar, JOptionPane.INFORMATION_MESSAGE); } } Варианты: * JOptionPane.WARNING_MESSAGE * JOptionPane.ERROR_MESSAGE * JOptionPane.PLAIN_MESSAGE * JOptionPane.INFORMATION_MESSAGE .. image:: _static/09/icons.png .. code-block:: java //Custom button text Object[] options = {"Yes, please", "No, thanks", "No eggs, no ham!"}; int n = JOptionPane.showOptionDialog(frame, "Would you like some green eggs to go " + "with that ham?", "A Silly Question", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[2]) .. image:: _static/09/eggs.png Вопросы для самоконтроля =============================================