Лекция 09. GUI.Swing

Введение

Пакеты

Для построения GUI в Java используются следующие основные пакеты:

  1. Awt - появился в первых версиях, используется мало.
  2. Swing - самый популярный пакет.
  3. JavaFX - современный и перспективный.

Awt пример

_images/awt-overview.png

Swing пример

_images/swing-overview.png

JavaFX пример

_images/fx-sample.png

Сравнение

Недостатки awt:

  • ‘’тяжеловесные’’ компоненты (системозависимые);
  • невозможность изменения внешнего вида.

Недостатки swing:

  • ограничения в изменении внешнего вида;
  • ориентация на desktop-приложения.

Swing

Простое приложение

Рассмотрим простейшее Swing-приложение.

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 может быть показана

на следующем примере:

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

обладает заголовком, кнопками управления.

Обработка событий

События

Рассмотрим пример с обработкой события:

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("Пока!");
  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

JButton btn = new JButton("Title");
JButton(Icon);
JButton(String);
JButton(String,Icon);
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

JTextField(int cols);
JTextField(String str,int cols);
JTextField(String str);
textfield.addActionListener(this);
..
public void actionPerformed(ActionEvent evt) {
  String text=textfield.getText();
  ..
  textfield.setText("Новый текст");
  ..
}

Password

..
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

text = new JTextArea();
..
text.setColumns(20);
text.setLineWrap(true);
text.setRows(5);
text.setEditable(true);
..
text.getText();
text.setText("...");
..

CheckBox

check = new JCheckBox("Photo");
check.setSelected(true);
..
check.addItemListener(new ItemListener() {
   public void itemStateChanged(ItemIvent e) {
      if(check.isSelected())...
   }
}

RadioButton

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

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
_images/icons.png
//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])
_images/eggs.png

Вопросы для самоконтроля