Начало работы с компонентами Swing

advertisement
Интернет-технологии
Основы 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();
}
});
}
}
Download