ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.07.2019
Просмотров: 343
Скачиваний: 2
Федеральное агентство связи
Федеральное государственное бюджетное образовательное
учреждение высшего образования
Поволжский государственный университет
телекоммуникаций и информатики
Кафедра Информационных систем и технологий
Лабораторная работа №8
По дисциплине «Инструментальные средства информационных систем»
Тема: «Разработка оконных приложений (форм) Java-приложений»
Руководитель доцент к. т. н.
__________________ Никитин К.А.
Самара 2018
-
Цель работы Получение практических навыков создания оконного приложения на языке Java.
-
Задание на выполнение работы
-
Создать исполняемый файл, запрашивающий имя и возраст пользователя, выводящий ответное сообщение в диалоговом окне.
package
com.company;
import
javax.swing.*; //библиотека
для создания графического интерфейса
import
java.awt.*; //исходная
платформо-независимая оконная библиотека
графического интерфейса
import
java.awt.event.ActionEvent;
import
java.awt.event.ActionListener;
import
java.util.regex.Matcher; //движок
для операции сравнения
import
java.util.regex.Pattern;
public
class Main {
public
static void main(String[] args) {
Pattern p = Pattern.compile("[a-zA-Zа-яА-Я]*");
//регулярное выражение
для имени
Pattern
l = Pattern.compile("^\\d{1,2}|100$");
//регулярное выражение
для возраста
Matcher
m;
JFrame Window = new
JFrame("Регистрация");
//создать экземпляр
класса фрейма (окно верхнего уровня)
JPanel panel = new
JPanel(); //создать
экземпляр класса окна
panel.setLayout(new
GridLayout(6,
1, 5,
10));
//задать количество
строк, столбцов и отступы
JLabel
label1 = new JLabel("name");//создать
экземпляр класса метки
JTextField
nameField = new JTextField();
//создать экземпляр
класса текстового поля для Имени
JTextField ageField = new
JTextField(); //создать
экземпляр класса текстового поля для
Возраста
JLabel
label2 = new JLabel("age");
//создать экземпляр
класса надписи
label1.setText("Введите
ваше имя"); //установить
для надписи Имя текст
label2.setText("Введите
ваш возраст");
//установить для надписи
Возраста текст
JButton
accept = new JButton();
//создать экземпляр
класса кнопки Принять
accept.setText("Принять");
//установить для
кнопки текст
accept.addActionListener(new
ActionListener() {
@Override //
добавить для кнопки Принять метод,
описывающий действия
public
void actionPerformed(ActionEvent e)
{ //создать метода для
книпки Принять
String
name = nameField.getText();//получить
текст поля Имя
String
age = ageField.getText();
//получить текст из
поля Возраст
boolean
isName = p.matcher(name).matches();
//соотвествие регулярному
выражению
boolean
isAge = l.matcher(age).matches();
//соотвествие
регулярному выражению
if (isName&&isAge)
//если имя и возраст
корректны
{
JFrame result = new
JFrame("Приветствие");
//создать экземпляр
класса фрейм
JLabel
labelRes = new JLabel("Result");
//создать экземпляр
класса надпись
labelRes.setText("
Вас зовут " + name + "
и ваш возраст " +
age); //установить текст
для надписи
result.add(labelRes);
//добавить надпись
в фрейм
result.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//закрыть все окна при
закрытии диалогового окна
result.setSize(300,
200);//установить
ширину, высоту окна
result.setVisible(true);
//установить видимость
окна
}
else {
//если данные
введены некорректно
nameField.setText("Некорректные
данные");
//установить текст для
надписи
ageField.setText("
"); //установить
текст для надписи
}
}
});
panel.add(label1);
//добавить надпись
Имени
panel.add(nameField);
//добавить
текстовое поле Имени
panel.add(label2);
//добавить
надпись Возраста
panel.add(ageField);
//добавить
текстовое поле Возраста
panel.add(accept);
//добавить
кнопку Принять
Window.add(panel);
//добавить
окно
Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//закрыть
все окна при закрытии диалогового окна
Window.setSize(400,
300);
//установить
ширину и высоту окна
Window.setVisible(true);
//установить
видимость
}
}
№ варианта |
Задание на выполнение |
5 |
Создать форму для вывода чисел в виде узора |
import
java.awt.EventQueue;//класс,
который обеспечивает очередь событий
глобально
import
javax.swing.JFrame; //для
создания основного контейнера для
приложения
import
javax.swing.JLabel; //для
создания метки
import
javax.swing.JTextArea; //для
создания поля ввода
import
javax.swing.JSpinner; //для
создания счетчика с выбором значения
import
javax.swing.SpinnerNumberModel;
//модель определяет
набор числовых значений
import
javax.swing.event.ChangeEvent;
//используется, чтобы
уведомить, что состояние изменило в
конечном счете источник.
import
javax.swing.event.ChangeListener;
//слушатель ChangeListener
реагирует на изменение состояния
объекта
public
class Main {
private
JFrame frame;
//создание приватного
объекта-фрейма
JSpinner
spinnerSize;
//создание счетчика
с выбором значений
JTextArea
textAreaTracery;
//создание поля
ввода
public
static void main(String[] args) {
EventQueue.invokeLater(new
Runnable(){
//SwingUtilities.invokeLater
предназначена для запуска асинхронной
операции. Она сохраняет действие, и
запускает его на одной из следующих
итераций цикла сообщений.
public void run(){//создание
метода, не возвращающего значения
try{
//начало блока кода,
который потенциально может привести к
ошибке
Main
window = new Main();
//создание объекта
класса Main
window.frame.setVisible(true);
//установить видимость
для фрейма
}
catch (Exception
e){ //начало блока
кода, предназначенного для перехвата
и обработки исключений
e.printStackTrace();//используется
для подробного вывода ошибок в консоли
}
}
});
}
public
Main(){ //создание
экземпляра класса Main
initialize();
//объявление метода
}
private
void initialize(){ //описание
метода
frame =
new JFrame();
//объявление фрейма
frame.setBounds(100,
100, 450,
300);
//методу передаются
четыре параметра, определяющих
расположение и размеры компонента
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//это нужно для того
чтобы при закрытии окна закрывалась и
программа, иначе она останется висеть
в процессах
frame.getContentPane().setLayout(null);
//getContentPane
панель содержимого, занимающая все
пространство окна
//setLayout(null)
самостоятельное расположение компонентов,
добавляемых на панель
JLabel
label = new JLabel(
//создание
метки
"Размерность
узора: ");
label.setBounds(35,
26, 121,
14);
//точное размещение
компонентов
frame.getContentPane().add(label);
//создание
панели с полосами прокрутки, в нее
помещается объект label, панель добавляется
в панель содержимого окна.
JLabel label_1 = new
JLabel( //создание
метки
"Узор:");
label_1.setBounds(35,
74, 46,
14);
//точное размещение
компонентов
frame.getContentPane().add(label_1);
//создание
панели с полосами прокрутки, в нее
помещается объект label, панель добавляется
в панель содержимого окна.
textAreaTracery =
new JTextArea();
//создание поля ввода
textAreaTracery.setBounds(108,
74, 213,
177);
//точное размещение
компонентов
frame.getContentPane().add(textAreaTracery);
//создание
панели с полосами прокрутки, в нее
помещается объект textAreaTracery, панель
добавляется в панель содержимого окна.
spinnerSize =
new JSpinner();
//создание счетчика
с выбором значения
spinnerSize.addChangeListener(new
ChangeListener() { //создание
слушателя, реагирующего на изменение
состояния объекта
@Override
public void
stateChanged(ChangeEvent e) {
//объявление приватного
метода
int
size =
(Integer)spinnerSize.getValue();
//создание переменной
со значением, определяемым выбранным
в счетчике числом
String
str = "";
//создание строки
for (int
i=1;
i<=size; i++){ //цикл для
выода числа узором
for
(int
j=1;
j<=i; j++){
str = str + j + "
";
}
str = str + "\n";
}
textAreaTracery.setText(str);//задание
нового текста надписи
}
});
spinnerSize.setModel(new
SpinnerNumberModel(0,
0, 9,
1));
//задание границ для
счетчика
spinnerSize.setBounds(181,
23, 46,
20);
//точное размещение
компонентов
frame.getContentPane().add(spinnerSize);
//создание панели с
полосами прокрутки, в нее помещается
объект spinnerSize, панель добавляется в
панель содержимого окна.
}
}
-
Контрольные вопросы
-
С помощью какого метода можно создать диалоговое окно?
Окна являются основой пользовательского интерфейса. Они визуально разделяют выполняемые в среде приложения.
Все окна библиотеки Swing — а к ним относятся окно без рамки JWindow, окно с рамкой JFrame и диалоговое окно JDialog — являются исключением из правила, согласно которому все компоненты Swing представляют собой легковесные компоненты и унаследованы от базового класса JComponent. Окна Swing являются тяжеловесными контейнерами для размещения в них легковесных компонентов, которые операционная система не видит.
Наиболее полезные JFrame методы
Методы |
Описание |
setLocation() |
Эта группа методов позволяет задать позицию и размеры окна на экране. setLocation() задает позицию окна, setSize() позволяет указать его размеры, а с помощью setBounds() можно сразу задать прямоугольник, который займет ваше окно на экране |
setSize() |
|
setBounds() |
|
раск() |
Позволяет «упаковать» имеющиеся в окне компоненты, так чтобы они занимали столько места, сколько им необходимо. Компоненты при вызове этого метода переходят в «видимое» состояние, хотя и не появляются на экране до вызова одного из следующих методов |
show() |
Отображение окна на экране. После вызова этих методов компоненты переходят в «видимое» состояние и начинают обслуживаться очередью событий. Метод show() к тому же проводит валидацию содержащихся в окне компонентов |
setVisible() |
|
dispose() |
Убирает окно с экрана (если оно в момент вызова метода видимо) и освобождает все принадлежащие ему ресурсы. |
-
Принцип построения оконного приложения
Графический интерфейс пользователя (Graphical User Interface, GUI) это система средств для взаимодействия пользователя с устройством, основанная на представлении всех доступных пользователю системных объектов и функций в виде графических компонентов экрана (окон, кнопок, полос прокрутки и т. п.).
Интерфейс - это конструкция языка программирования Java, в рамках которой могут описываться только абстрактные публичные (abstract public) методы и статические константы. То есть так же, как и на основе абстрактных классов, на основе интерфейсов нельзя порождать объекты.Один интерфейс может быть наследником другого интерфейса.
Классы могут реализовывать интерфейсы (т.е. получать от интерфейса список методов и описывать реализацию каждого из них), притом, что особенно важно, один класс может реализовывать сразу несколько интерфейсов.
Перед описанием интерфейса указывается ключевое слово interface. Когда класс реализует интерфейс, то после его имени указывается ключевое слово implements и далее через запятую перечисляются имена тех интерфейсов, методы которых будут полностью описаны в классе.
В большинстве визуальных библиотек метка – один из самых простейших компонентов. Она представляет собой обычный текст, который выводится в заданном месте окна и используется для вывода вспомогательной текстовой информации: подписи к другим элементам, инструкции и предупреждения для пользователя. В Swing метка позволяет достичь более интересных эффектов. Во-первых, помимо текста можно использовать значок. Во-вторых, с ее помощью можно выводить отформатированный текст.
Текст и значок метки можно задать в ее конструкторе. У нее есть несколько конструкторов с различными параметрами, в частности:
JLabel(String text) – создает метку с надписью text
JLabel(Icon image) – создает метку со значком image
JLabel(String text, Icon image, int align) – создает метку с надписью text и значком image. Третий параметр задает выравнивание текста вместе со значком. В качестве него может быть использована одна из констант, описанных в интерфейсе SwingConstants: LEFT, RIGHT, CENTER.
В библиотеке Swing метка (и не только она) может быть настроена для отображения отформатированного текста в формате HTML. Для этого необходимо, чтобы строка, устанавливаемая в качестве надписи метки, начиналась с тега <html>. После этого можно использовать в строке любые теги языка HTML версии 3.2, и они будут преобразовываться в соответствующие атрибуты форматирования.
-
Какие библиотеки должны присутствовать при создании оконного приложения? Swing
-
Значение метки JLabel?
Основные методы класса JLabel:
getText() – возвращает текущий текст надписи метки.
setText(String text) – задает новый текст надписи.
getIcon() – возвращает значок метки.
setIcon(Icon image) – устанавливает новый значок. В качестве значка обычно используется объект простого класса ImageIcon.
getVerticalAlignment(), setVerticalAlignment(int align), getHorizontalAlignment(), setHorizontalAlignment(int align) – эти четыре метода позволяют получить текущее или установить новое выравнивание (по горизонтали и вертикали) метки относительно ее границ. Возможные положения описаны в интерфейсе SwingConstants.
getVerticalTextPosition(), setVerticalTextPosition(int align), getHorizontalTextPosition(), setHorizontalTextPosition(int align) – эти четыре метода позволяют получить текущее или установить новое выравнивание текста относительно значка. Возможные положения описаны в интерфейсе SwingConstants.
getIconTextGap(), setIconTextGap(int gap) – позволяет получить или задать расстояние между текстом и значком метки в пикселах.
-
Свойства кнопки JButton?
Кнопка – это прямоугольник с текстом (и/или значком), по которому пользователь щелкает, когда хочет выполнить какое-то действие (или о чем-то сигнализировать).
Кнопка создается одним из пяти конструкторов, в частности JButton(), JButton(String text), JButton(Icon icon), JButton(String text, Icon icon), параметры которых говорят сами за себя.
Кроме обычного значка можно назначить кнопке еще несколько – для различных состояний. Метод setRolloverIcon(Icon icon) позволяет задать значок, который будет появляться при наведении на кнопку мыши, setPressedIcon(Icon icon) – значок для кнопки в нажатом состоянии, setDisableIcon(Icon icon) – значок для неактивной кнопки. Каждому из этих методов соответствует метод get.
Метод setMargin(Insets margin) позволяет задать величину отступов от текста надписи на кнопке до ее полей. Объект класса Insets, который передается в этот метод, может быть создан конструктором с четырьмя целочисленными параметрами, задающими величину отступов: Insets(int top, int left, int bottom, int right). Метод getMargin() возвращает величину текущих отступов в виде объекта того же класса.
Все методы класса JLabel присутствуют и в классе JButton. С помощью этих методов можно изменять значок и текст надписи на кнопке, а также управлять их взаимным расположением друг относительно друга и относительно края кнопки (с учетом отступов).
Компоненты JToggleButton, JCheckBox, JRadioButton
Компонент JToggleButton представляет собой кнопку, которая может находиться в двух состояниях: нажатом и отпущенном. Когда пользователь щелкает мышкой по такой кнопке, она изменяет свое состояние. Именно таким образом ведут себя кнопки форматирования на инструментальной панели текстового редактора. Кнопка [I] не только устанавливает или убирает курсивное начертание в выделенном тексте, но и сигнализирует о его наличии или отсутствии.
Основной конструктор – JToggleButton(String text, Icon icon, boolean selected) создает кнопку с заданными надписью, значком и текущим состоянием. Кнопку можно перевести в требуемое состояние программным путем, вызвав метод setSelected(boolean selected). Метод isSelected() возвращает true, если кнопка выбрана (т.е. находится в нажатом состоянии) и false в противном случает.
От класса JToggleButton унаследован класс JCheckBox – флажок. Этот класс имеет точно такой же набор конструкторов и методов, т.е. не расширяет функциональность предка. Единственное различие между ними – во внешнем виде: JCheckBox выглядит не как кнопка, а как небольшой квадратик, в котором можно поставить или убрать галочку.
Аналогичным образом ведет себя класс JRadioButton – переключатель или радиокнопка, внешне выглядящая как пустой кружок, когда она не выделена и кружок с точкой в выделенном состоянии.
В ButtonGroup могут быть добавлены не только переключатели, но и флажки, и кнопки выбора (и даже обычные кнопки). Но при разработке интерфейса следует следовать устоявшемуся подходу, согласно которому во взаимоисключающую группу следует объединять объекты JRadioButton (и, в некоторых случаях JToggleButton), но не JCheckBox.
JToggleButton tButton1 = new JToggleButton("Кнопка выбора 1");
JToggleButton tButton2 = new JToggleButton("Кнопка выбора 2", icon);
JCheckBox check1 = new JCheckBox("Флажок 1");
JCheckBox check2 = new JCheckBox("Флажок 2", icon);
JRadioButton rButton1 = new JRadioButton("Переключатель 1");
JRadioButton rButton2 = new JRadioButton("Переключатель 2", icon);
-
Что такое поле для ввода пароля JPasswordField?
JPasswordField class, подкласс JTextField, обеспечивает специализированные текстовые поля для ввода пароля. Для соображений безопасности поле пароля не показывает символы, что пользователь вводит. Вместо этого поле выводит на экран символ, отличающийся от введенного того, такого как звездочка '*'. Как другая предосторожность безопасности, поле пароля хранит свое значение как массив символов, а не как строка. Как обычное текстовое поле, поле пароля запускает событие действия, когда пользователь указывает, что ввод текста полон, например нажимая кнопку Enter.
-
Что такое панель прокрутки JScrollPane?
В зависимости от используемого менеджера расположения текст либо обрезается, уходя за границы компонента, либо раздвигает эти границы (но в любом случае остается ограничен размером окна). В таких случаях типично использование полос прокрутки, но в Swing полосы прокрутки сами собой не появляются.