Материал: Java. Лабораторная работа 8

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Федеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Факультет инфокоммуникационных сетей и систем Кафедра программной инженерии и вычислительной техники

ЛАБОРАТОРНАЯ РАБОТА №8

по дисциплине «Разработка Java-приложений управления телекоммуникациями»

Выполнил: студент 3-го курса дневного отделения группы ИКПИ-85

Коваленко Леонид Александрович Преподаватель:

доцент кафедры ПИиВТ Белая Татьяна Иоанновна

Санкт-Петербург

2020

Цель работы Ознакомиться с базовыми принципами создания апплетов, технологией

Swing и обработкой событий.

Ход работы

Создадим апплет «Калькулятор векторов» при помощи Swing (примечание: поддержка апплетов исключена из Java, начиная с версии 11).

На форме будут присутствовать три поля ввода с подписями (первое для указания размера вектора для его создания, второе для указания индекса вектора в качестве первого операнда, третье для указания индекса вектора в качестве второго операнда), список векторов с индексами, кнопка для вычисления скалярного произведения, кнопка для вычисления суммы векторов, кнопка для открытия файла для добавления данных в программу, кнопка сохранения данных в файл из программы.

В случае некорректных запросов со стороны пользователя будут выводиться окна с сообщениями об ошибках.

Длина векторов будет ограничена только естественными ограничениями (допустимые значения типа int) и операционной системой.

Код приведен в табл. 1. Таблица 1 — Код Task8.java

// <applet code="Task8" width=470 height=390></applet> import vectors.Array;

import vectors.IVector; import vectors.Vectors;

import javax.swing.*; import java.awt.*;

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader;

import java.io.FileWriter; import java.util.ArrayList;

public class Task8 extends JApplet { // Spinner. Целые числа

JSpinner vectorSizeEdit = new JSpinner(new SpinnerNumberModel(5, 1, Integer.MAX_VALUE, 1)),

firstVectorIndexEdit = new JSpinner(new SpinnerNumberModel(0, 0, Integer.MAX_VALUE, 1)),

secondVectorIndexEdit = new JSpinner(new SpinnerNumberModel(1, 0, Integer.MAX_VALUE, 1));

// Кнопки

JButton createButton = new JButton("Добавить вектор"),

2

clearButton = new JButton("Удалить все векторы"), scalarMulButton = new JButton("Скалярное произведение"), sumButton = new JButton("Сумма векторов"),

openButton = new JButton("Открыть..."), saveButton = new JButton("Сохранить...");

//Массив объектов JTextField (текстовых полей ввода векторов) ArrayList<JTextField> vectorArrayList = new ArrayList<JTextField>();

//Панель mainPanel содержит панели topPanel и centerPane(centerPanel) JPanel mainPanel = new JPanel(),

topPanel = new JPanel(new GridLayout(0, 2, 5, 5)), centerPanel = new JPanel(new GridLayout(0, 1));

//Прокручиваемая область

JScrollPane centerPane = new JScrollPane(centerPanel);

// Метод инициализации public void init() {

// Отображение значений внутри Spinner по центру ((JSpinner.DefaultEditor)

vectorSizeEdit.getEditor()).getTextField().setHorizontalAlignment(JTextField. CENTER);

((JSpinner.DefaultEditor) firstVectorIndexEdit.getEditor()).getTextField().setHorizontalAlignment(JText Field.CENTER);

((JSpinner.DefaultEditor) secondVectorIndexEdit.getEditor()).getTextField().setHorizontalAlignment(JTex tField.CENTER);

// Настройка верхней панели topPanel.add(new JLabel("Размер вектора:")); topPanel.add(vectorSizeEdit);

topPanel.add(new JLabel("Индекс первого вектора:")); topPanel.add(firstVectorIndexEdit); topPanel.add(new JLabel("Индекс второго вектора:")); topPanel.add(secondVectorIndexEdit); topPanel.add(createButton); topPanel.add(clearButton); topPanel.add(scalarMulButton); topPanel.add(sumButton);

topPanel.add(openButton);

topPanel.add(saveButton);

// Настройка центральной панели centerPane.setPreferredSize(new Dimension(442, 200));

centerPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDE D);

//Настройка главной панели mainPanel.add(topPanel, BorderLayout.NORTH); mainPanel.add(centerPane, BorderLayout.CENTER); getContentPane().add(mainPanel);

//Настройка каркаса

Frame mainFrame = (Frame) this.getParent().getParent(); mainFrame.setTitle("Калькулятор векторов"); // Заголовок mainFrame.setResizable(false); // Запрет изменения размеров mainFrame.setLocationRelativeTo(null); // По центру

// Настройка обработчика нажатия на кнопку создания вектора createButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent actionEvent) { int len;

try { len =

Integer.parseInt(vectorSizeEdit.getValue().toString()); } catch (Exception e) {

JOptionPane.showMessageDialog(null, "Размер введен неверно", "Ошибка", JOptionPane.ERROR_MESSAGE);

e.printStackTrace();

3

return;

}

StringBuilder valueString = new StringBuilder(2 * len); valueString.append('0');

for (int i = 1; i < len; ++i) { valueString.append(" 0");

}

addVector(valueString.toString());

}

});

//Настройка обработчика нажатия на кнопку очистки панели с векторами clearButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent actionEvent) { clearVectorPanel();

}

});

//Настройка обработчика нажатия на кнопку для выполнения скалярного

умножения

scalarMulButton.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent actionEvent) {

try {

Array[] arrays = getTwoVectors();

if (arrays[0] == null || arrays[1] == null) { return;

}

double result = Vectors.mul(arrays[0], arrays[1]); JOptionPane.showMessageDialog(null, "Результат скалярного

произведения двух векторов: " + result, "Результат", JOptionPane.PLAIN_MESSAGE);

} catch (Exception e) { JOptionPane.showMessageDialog(null, "Ошибка при

вычислении скалярного произведения двух векторов", "Ошибка", JOptionPane.ERROR_MESSAGE);

e.printStackTrace();

}

}

}); // Настройка обработчика нажатия на кнопку для выполнения суммы двух

векторов

sumButton.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent actionEvent) { try {

Array[] arrays = getTwoVectors();

if (arrays[0] == null || arrays[1] == null) { return;

}

IVector result = Vectors.sum(arrays[0], arrays[1]); JOptionPane.showMessageDialog(null, "Результат сложения

двух векторов:\n" + result.toString(), "Результат", JOptionPane.PLAIN_MESSAGE);

} catch (Exception e) {

JOptionPane.showMessageDialog(null, "Ошибка при сложении двух векторов", "Ошибка", JOptionPane.ERROR_MESSAGE);

e.printStackTrace();

}

}

}); // Настройка обработчика нажатия на кнопку для открытия файла с

векторами

openButton.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent actionEvent) {

4

try {

JFileChooser openFile = new JFileChooser(); if (openFile.showOpenDialog(null) ==

JFileChooser.APPROVE_OPTION) {

if (!openFile.getSelectedFile().exists()) { JOptionPane.showMessageDialog(null, "Такого файла

не существует", "Ошибка", JOptionPane.ERROR_MESSAGE); return;

}

try (BufferedReader bufferedReader = new BufferedReader(new FileReader(openFile.getSelectedFile()))) {

if (vectorArrayList.size() > 0 && JOptionPane.showConfirmDialog(null, "Предварительно очистить список векторов?", "Вопрос", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {

clearVectorPanel();

}

for (String line; (line = bufferedReader.readLine()) != null; ) {

String[] elements = line.split("[,;\\s]+"); Array vector = new Array(elements.length); for (int i = 0; i < elements.length; ++i) {

vector.set(i,

Double.parseDouble(elements[i]));

}

addVector(vector.toString());

}

} catch (Exception e) { JOptionPane.showMessageDialog(null, "Ошибка

чтения данных из файла", "Ошибка", JOptionPane.ERROR_MESSAGE); e.printStackTrace();

}

}

} catch (Exception e) { JOptionPane.showMessageDialog(null, "HeadlessException.

Ошибка совместимости периферии", "Ошибка", JOptionPane.ERROR_MESSAGE); e.printStackTrace();

}

}

}); // Настройка обработчика нажатия на кнопку для сохранения файла с

векторами

saveButton.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent actionEvent) { try {

JFileChooser saveFile = new JFileChooser(); if (saveFile.showSaveDialog(null) ==

JFileChooser.APPROVE_OPTION) {

if (saveFile.getSelectedFile().exists() && JOptionPane.showConfirmDialog(null, "Перезаписать файл?", "Вопрос", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) {

return;

}

try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(saveFile.getSelectedFile()))) {

for (JTextField textField : vectorArrayList) { bufferedWriter.write(textField.getText() + "\

n");

}

} catch (Exception e) { JOptionPane.showMessageDialog(null, "Ошибка

записи данных в файл", "Ошибка", JOptionPane.ERROR_MESSAGE); e.printStackTrace();

}

}

5