Использование диалогового окна


Введение данных во время выполнения программы можно реализовать не через консоль, а с помощью специального диалогового окна, которое является компонентом графической библиотеки Swing. Для подключения библиотеки необхо димо в заголовок файла программы включить инструкцию import javax.swing.*. Само диалоговое окно вызывается командой вида JOptionPane.showInputDialog(аргумент), где аргументом статического метода showInputDialog() класса JOptionPane указывается текст, отображаемый над полем ввода диалогового окна. В качестве результата методом showInputDialog() возвращается текст, который вводится пользователем в поле ввода диалогового окна.

Поскольку при вызове диалогового окна создается новый поток, который автоматически не завершается при закрытии окна, для завершения программы совсеми ее потоками требуется использовать инструкцию System.exit(0).

Обращаем внимание читателя, что результатом вызова метода showInputDialog() является текст, что не всегда соответствует формату исходных данных, например пользователь может ввести в поле ввода диалогового окна число. В таких случаях применяют методы преобразования форматов. В частности, для перевода текстового представления чисел в числовые форматы вызывают статический метод parseInt() класса-оболочки Integer и статический метод parseDouble() класса-оболочки Double. Аргументами методов указывают текстовое представление числа. Метод parseInt() предназначен для работы с целыми числами, а parseDouble() — с действительными.

Пример программы, в которой для ввода данных используется диалоговое окно, приведен в листинге 4.

Листинг 4.Ввод с помощью диалогового окна

// Импорт пакета:

import javax.swing.*;

class MyOptionPane{

public static void main(String args[]){

// Текстовое поле (имя):

String name;

// Числовое поле (возраст):

int age;

// Вопрос:

System.out.println("Как Вас зовут?");

// Открываем диалоговое окно:

name=JOptionPane.showInputDialog("Укажите Ваше имя");

// Выводим резльтат считывания:

System.out.println("Считано имя: "+name);

// Приветствие:

System.out.println("Добрый день, "+name+"!");

// Вопрос:

System.out.println("Сколько Вам лет?");

// Открываем диалоговое окно:

age=Integer.parseInt(JOptionPane.showInputDialog("Укажите Ваш возраст"));

// Выводим результат считывания:

System.out.println("Считан возраст: "+age+" лет.");

// Сообщение:

System.out.println(name+", Вам "+age+" лет!");

// Завершение всех потоков:

System.exit(0);}

}

Фактически, представленная программа является модификацией рассмотренного ранее примера. Только теперь для ввода имени и возраста пользователя используется не консоль, а диалоговое окно.

Для того чтобы можно было воспользоваться утилитами библиотеки Swing, командой import javax.swing.* в заголовке файла программы выполняем импорт соответствующего пакета.

Как и ранее, в главном методе программы объявляется текстовое поле name для записи имени пользователя и числовое поле age для записи возраста пользователя. Далее выводится приглашение пользователю указать свое имя, однако для считывания имени используется команда name=JOptionPane.showInputDialog("Укажите Ваше имя")

В результате открывается диалоговое окно, содержащее текстовое поле ввода

(рис. 1).

Рис. 1.Диалоговое окно с полем для ввода имени пользователя

Переданный методу showInputDialog() текст "Укажите Ваше имя" отображается над полем ввода в открытом диалоговом окне. В поле вводится текст (в данном случае Алексей Васильев), после чего щелкают на кнопке OK в диалоговом окне.

В результате введенный в поле диалогового окна текст присваивается в качестве значения полю name.

Для считывания возраста пользователя используем команду

age=Integer.parseInt(JOptionPane.showInputDialog("Укажите Ваш возраст"))

В данном случае команда считывания значения из поля диалогового окна JOptionPane.showInputDialog("Укажите Ваш возраст") передается аргументом методу Integer.parseInt() для преобразования считанного из поля текста в числовой формат — предполагается, что пользователь введет в поле целое число. Открывающееся при этом диалоговое окно для ввода возраста пользователя представлено на рис. 2

 

Рис. 2.Диалоговое окно с полем для ввода возраста пользователя

Поскольку теперь в окне консоли вводимые пользователем в диалоговом окне значения не отображаются, программа дополнена командами вывода на консоль введенных пользователем имени (команда System.out.println("Считано имя: "+name)) и возраста (команда System.out.println("Считан возраст: "+age+" лет.")).

Консольный вывод программы при этом имеет следующий вид:

 

Как Вас зовут?

Считано имя: Алексей Васильев

Добрый день, Алексей Васильев!

Сколько Вам лет?

Считан возраст: 35 лет.

Алексей Васильев, Вам 35 лет!

 

Представленный способ ввода данных с помощью диалогового окна достаточно прост и в то же время удобен. Подробнее методы работы с графическими утилитами библиотеки Swing описываются в следующих главах.

 

Работа с файлами

Практически важной является задача ввода данных в файлы и вывода данных из файла. Благодаря концепции потоков ввода-вывода, ввод и вывод информации в файлы и из файлов осуществляется достаточно просто. Для этого создается поток ввода или вывода и подключается к соответствующему файлу. При этом используют классы файловых потоков FileInputStream (файловый поток ввода) и FileOutputStream (файловый поток вывода). Конструкторы классов FileInputStream и FileOutputStream выбрасывают исключение FileNotFoundException (файл не найден). Имя (полное) файла, с которым связывается поток ввода или вывода, в виде текстовой строки передается аргументом конструктору.

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

Листинг 5.Работа с файлами

// Подключение пакета:

import java.io.*;

class WriteToFile{

public static void main(String args[]) throws IOException{

// Целочисленное поле:

int a;

try{

// Поток файлового вывода:

FileOutputStream fout=new FileOutputStream("F:/Java_2/Files/mydata.txt");

// Поток файлового ввода:

FileInputStream fin=new FileInputStream("F:/Java_2/Files/base.txt");

// Считывание из файла:

a=fin.read();

while(a!=-1){

// Замена пробелов символами подчеркивания:

if(a==(int)' ') a=(int)'_';

// Запись в файл:

fout.write(a);

// Считывание из файла:

a=fin.read();}

// Закрыт поток вывода:

fout.close();

// Закрыт поток ввода:

fin.close();

}catch(FileNotFoundException e){ // Обработка исключения "файл не найден":

System.out.println("Нет доступа к файлу: "+e);}

// Сообщение программы:

System.out.println("Работа программы завершена!");}

}

Программа достаточно проста: посимвольно считывается информация из исходного текстового файла base.txt и записывается в файл mydata.txt. При этом все пробелы заменяются символами подчеркивания. На консоль программой по завершении работы выводится сообщение "Работа программы завершена!".

Основные события происходят в файлах. Вот содержимое исходного файла

base.txt:

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

1. Учебник

2. Компьютер

3. Программное обеспечение

4. Желание учиться

 

После выполнения программы содержимое файла mydata.txt будет следующим:

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

1._Учебник

2._Компьютер

3._Программное_обеспечение

4._Желание_учиться

Рассмотрим подробнее, как выполняется программа. В первую очередь для использования классов, через которые реализована система ввода-вывода (в том числе и в файлы), командой import java.io.* подключаем пакет java.io.

В главном методе программы описывается целочисленное поле a для посимвольного считывания из файлов. Поскольку использоваться при этом будет метод read(), который считывает символ и возвращает его числовой код, выбор типа поля a как имеющего тип int вполне оправдан.

Файловый поток вывода fout создается командой

FileOutputStream fout=new FileOutputStream("F:/Java_2/Files/mydata.txt")

Файловый поток fout — это объект класса FileOutputStream. Поток подключается к файлу mydata.txt, причем аргументом конструктора класса FileOutputStream указывается текстовая строка с полным именем файла. Поток fout используется в дальнейшем для вывода данных в файл mydata.txt.

Поток файлового ввода fin создается командой

FileInputStream fin=new FileInputStream("F:/Java_2/Files/base.txt")

Файловый поток fin — это объект класса FileInputStream. Поток подключается к файлу base.txt. Аргументом конструктора класса FileInputStream указывается текстовая строка с полным именем файла. С помощью потока fin будет осуществляться ввод информации из файла base.txt в программу.

Далее командой a=fin.read() выполняется считывание символа из файла base.txt. Для этого из объекта потока файлового ввода fin (связанного, напомним, с файлом base.txt) вызывается метод read(), возвращающий код считанного из файла символа. Этот код записывается в поле a.

В цикле while проверяется условие a!=-1, означающее, на самом деле, что считанный символ не является символом конца файла. Если конец файла не достигнут, условной инструкцией if(a==(int)' ') a=(int)'_' в случае необходимости пробел заменяется символом подчеркивания, и командой fout.write(a) этот символ записывается в файл mydata.txt. Для записи символа в файл из объекта файлового потока вывода fout (связанного с файлом mydata.txt) вызывается метод write(), аргументом которого указывается код записываемого в соответствующий файл символа. После этого командой a=fin.read() считывается следующий символ из файла base.txt и его код записывается в поле a.

После завершения цикл while потоки вывода и ввода закрываются командами fout.close() и fin.close() соответственно.

Также в методе main() при создании файловых потоков и работе с ними отслеживается исключение FileNotFoundException (нет доступа к файлу). В случае возникновения такого исключения выводится текстовое сообщение. Для проверки, как программа реагирует на исключительную ситуацию, достаточно изменить название базового файла base.txt и запустить программу. Результат будет следующим:

Нет доступа к файлу: java.io.FileNotFoundException: F:\Java_2\Files\base.txt

(Не удается найти указанный файл)

Работа программы завершена!

При этом файл mydata.txt оказывается пустым, даже если до этого там что-то было записано. Дело в том, что в программе сначала создается файловый поток вывода, а затем файловый поток ввода. Исключение возникает именно при создании потока ввода, когда файл mydata.txt уже открыт для ввода и очищен от содержимого.

Другой пример работы с системой ввода-вывода, в том числе файловой, приведен в листинге 6.

Листинг 6.Система ввода-вывода

// Подключение пакетов:

import java.io.*;

import javax.swing.*;

class FindFellow{

public static void main(String args[]) throws IOException{

// Текстовое поле (имя файла):

String fileName;

// Текстовое поле (фамилия сотрудника):

String name;

// Текстовое поле (для считывания текста):

String s;

// Считывание имени файла:

fileName=JOptionPane.showInputDialog("Укажите имя файла:");

try{

// Создание файлового потока ввода:

FileInputStream fin=new FileInputStream("F:/Java_2/Files/"+fileName);

// Создание буферизованного символьного потока (из файла):

BufferedReader br=new BufferedReader(new InputStreamReader(fin));

// Считывание фамилии сотрудника:

name=JOptionPane.showInputDialog("Укажите фамилию сотрудника:");

// Формально "бесконечный" цикл:

while(true){

// Считывание строки из файла:

s=br.readLine();

try{

if(s.equalsIgnoreCase(name)){// Вывод "послужного списка"

System.out.println("Фамилия : "+name);

System.out.println("Имя : "+br.readLine());

System.out.println("Отчество : "+br.readLine());

System.out.println("Возраст : "+br.readLine());

System.out.println("Тел. : "+br.readLine());

break;}

}catch(NullPointerException e){// Обработка исключения

System.out.println("Такого сотрудника нет!");

// Выход из цикла:

break;}

}

// Закрываем файловый поток:

fin.close();

}catch(FileNotFoundException e){// Обработка исключения

System.out.println("Ошибка доступа к файлу: "+e);}

// Завершение всех потоков:

System.exit(0);}}

Программой по введенной пользователем фамилии производится поиск сотрудника в импровизированной базе данных, представленной в виде текстового файла. Текстовый файл personal.txt, используемый в качестве базы поиска, содержит записи всего о трех сотрудниках. Содержимое файла personal.txt выглядит так:

 

Петров

Иван

Сергеевич

526-44-12

Сидоров

Игорь

Степанович

526-00-13

Иванов

Семен

Николаевич

522-16-48

 

В частности, после фамилии сотрудника построчно указываются его имя, отчество, возраст и телефон.

Программой выводится запрос (диалоговое окно с полем ввода) для ввода имени файла, в котором производится поиск. После этого во втором диалоговом окне необходимо указать фамилию сотрудника для поиска в файле. Если совпадение по фамилии найдено, для данного сотрудника выводится весь «послужной список»: фамилия, имя, отчество, возраст и телефон. Если сотрудника с указанной фамилией нет, на консоль выводится соответствующее сообщение.

Инструкциями import java.io.* и import javax.swing.* подключаются пакеты java.io (для использования классов системы ввода-вывода) и javax.swing (для использования утилит библиотеки Swing и, в частности, диалогового окна с полем ввода).

В главном методе программы объявляются три текстовых поля класса String: поле fileName для записи имени файла, в котором осуществляется поиск, поле name для записи фамилии сотрудника и поле s для записи строк, считываемых из файла.

Диалоговое окно с полем ввода имени файла выводится командой

fileName= JOptionPane.showInputDialog("Укажите имя файла:")

В окно вводится только имя файла без указания каталога. Каталог размещения добавляется к имени файла при создании файлового потока ввода командой

FileInputStream fin=new FileInputStream("F:/Java_2/Files/"+fileName)

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

BufferedReader br=new BufferedReader(new InputStreamReader(fin)).

Точнее, на основе объекта fin создается анонимный объект класса InputStreamReader, а уже на его основе создается объект буферизованного потока. Аналогичная ситуация имела место при консольном вводе, только там буферизованный поток создавался по той же схеме на основе объекта стандартного ввода System.in.

Фамилия сотрудника для поиска вводится в диалоговом окне, которое открывается командой

name=JOptionPane.showInputDialog("Укажите фамилию сотрудника:")

Результат ввода записывается в поле name.

После этого запускается формально бесконечный цикл while — условием в нем указано логическое значение true. В цикле командой s=br.readLine() выполняется построчное считывание из файла. Затем в условной инструкции командой s.equalsIgnoreCase(name) проверяется условие совпадения считанной строки и фамилии, записанной в поле name. Если совпадение найдено, последовательно выводятся все параметры записи для данного сотрудника. При этом неявно предполагается, что в файле после строки с фамилией следуют строки с именем, отчеством, возрастом и номером телефона. Завершается блок команд вывода сведений о пользователе инструкцией break, благодаря чему работа цикла завершается.

Обработка ситуации, когда в цикле совпадений не обнаруживается, реализована через обработку исключения NullPointerException — это исключение (ошибка операции с нулевым указателем) возникает при попытке считать строку после того, как достигнут конец файла. В этом случае в обработчике исключения в блоке catch выводится сообщение о том, что сотрудника с указанной фамилией нет, и инструкцией break прекращается выполнение цикла.

После инструкции цикла командой fin.close() закрывается файловый поток, а командой System.exit(0) завершается работа всех потоков.

В программе также обрабатывается исключительная ситуация FileNotFoundException (отсутствие доступа к файлу). В этом случае выводится сообщение соответствующего содержания с описанием ошибки.

Если при запуске программы в первое окно ввести имя файла personal.txt (рис. 3) и фамилию Сидоров (рис. 4), результат выполнения программы будет следующим:

 

Фамилия : Сидоров

Имя : Игорь

Отчество : Степанович

Возраст : 46

Тел. : 526-00-13

 

Если фамилию сотрудника указать неправильно (то есть такую, которой нет в файле personal.txt), появится сообщение: Такого сотрудника нет!

Если неверно указано имя файла, будет получено сообщение:

Ошибка доступа к файлу: java.io.FileNotFoundException: F:\Java_2\Files\df

(Не удается найти указанный файл)

При этом до ввода фамилии дело не доходит — работа программы завершается. Хотя при желании можно сделать так, чтобы этого не происходило.

Рис. 3.Диалоговое окно для ввода имени файла

 

Рис. 4.Диалоговое окно для ввода фамилии сотрудника



Дата добавления: 2016-06-22; просмотров: 2238;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.039 сек.