ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.07.2019

Просмотров: 343

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Федеральное агентство связи


Федеральное государственное бюджетное образовательное

учреждение высшего образования


Поволжский государственный университет

телекоммуникаций и информатики


Кафедра Информационных систем и технологий




Лабораторная работа №8

По дисциплине «Инструментальные средства информационных систем»

Тема: «Разработка оконных приложений (форм) Java-приложений»















Руководитель доцент к. т. н.

__________________ Никитин К.А.













Самара 2018

  1. Цель работы Получение практических навыков создания оконного приложения на языке Java.



  1. Задание на выполнение работы

    1. Создать исполняемый файл, запрашивающий имя и возраст пользователя, выводящий ответное сообщение в диалоговом окне.



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, панель добавляется в панель содержимого окна.
}
}











  1. Контрольные вопросы

  1. С помощью какого метода можно создать диалоговое окно?

Окна являются основой пользовательского интерфейса. Они визуально разделяют выполняемые в среде приложения.

Все окна библиотеки Swing — а к ним относятся окно без рамки JWindow, окно с рамкой JFrame и диалоговое окно JDialog — являются исключением из правила, согласно которому все компоненты Swing представляют собой легковесные компоненты и унаследованы от базового класса JComponent. Окна Swing являются тяжеловесными контейнерами для размещения в них легковесных компонентов, которые операционная система не видит.

Наиболее полезные JFrame методы

Методы

Описание

setLocation()

Эта группа методов позволяет задать позицию и размеры окна на экране. setLocation() задает позицию окна, setSize() позволяет указать его размеры, а с помощью setBounds() можно сразу задать прямоугольник, который займет ваше окно на экране

setSize()

setBounds()

раск()

Позволяет «упаковать» имеющиеся в окне компоненты, так чтобы они занимали столько места, сколько им необходимо. Компоненты при вызове этого метода переходят в «видимое» состояние, хотя и не появляются на экране до вызова одного из следующих методов

show()

Отображение окна на экране. После вызова этих методов компоненты переходят в «видимое» состояние и начинают обслуживаться очередью событий. Метод show() к тому же проводит валидацию содержащихся в окне компонентов

setVisible()

dispose()

Убирает окно с экрана (если оно в момент вызова метода видимо) и освобождает все принадлежащие ему ресурсы.

  1. Принцип построения оконного приложения

Графический интерфейс пользователя (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, и они будут преобразовываться в соответствующие атрибуты форматирования.

  1. Какие библиотеки должны присутствовать при создании оконного приложения? Swing

  2. Значение метки 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) – позволяет получить или задать расстояние между текстом и значком метки в пикселах.

  1. Свойства кнопки 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);

  1. Что такое поле для ввода пароля JPasswordField?

JPasswordField class, подкласс JTextField, обеспечивает специализированные текстовые поля для ввода пароля. Для соображений безопасности поле пароля не показывает символы, что пользователь вводит. Вместо этого поле выводит на экран символ, отличающийся от введенного того, такого как звездочка '*'. Как другая предосторожность безопасности, поле пароля хранит свое значение как массив символов, а не как строка. Как обычное текстовое поле, поле пароля запускает событие действия, когда пользователь указывает, что ввод текста полон, например нажимая кнопку Enter.

  1. Что такое панель прокрутки JScrollPane?

В зависимости от используемого менеджера расположения текст либо обрезается, уходя за границы компонента, либо раздвигает эти границы (но в любом случае остается ограничен размером окна). В таких случаях типично использование полос прокрутки, но в Swing полосы прокрутки сами собой не появляются.