Создание приложения, реализующего расчетный алгоритм, с возможностью сохранения и считывания данных из файла
Цель работы: создать приложение Java, с помощью которого можно рассчитать некоторую функцию, при этом исходные данные можно было бы считать как из текстового файла, так и с полей формы.
Попробуем осмыслить задачу. Расчетный алгоритм пока не суть важен, необходимо научиться считывать данные из текстового файла. Записывать данные в файл мы уже умеем (см. лаб. работу 4). Считывание данных из текстового файла происходит по практически идентичному алгоритму. Его усложненный вариант уже использовался в работе 6 при считывании файла с использованием диалога JfileChooser. Попробуем упростить этот код:
try { BufferedReader in = new BufferedReader(new FileReader("infilename")); String str; while ((str = in.readLine()) != null) { System.out.println(str); } in.close(); } catch (IOException e) { }
Вместо"infilename"необходимо указать путь к файлу. Проверку работы алгоритма сделать самостоятельно.
Представляется интересным следующий аспект. Если у нас будет выбор, откуда считывать входную информацию, то логично будет реализовать этот выбор при помощи переключателей. Однако еще более логичным будет в принципе не допустить некорректного действия пользователя: если выбран переключатель «Считывать из файла», то поле формы должно быть закрыто для ввода. Наоборот, если выбран переключатель «Форма», то поле должно допускать ввод. Текст программы для реализации этого алгоритма приведен ниже. Предполагается, что уже существует апплет или контейнер с именем f, на который мы добавляем контейнер Panel с именем jpl:
Panel jpl=new Panel ();
jpl.setSize(200,200);
jpl.setLayout(new BorderLayout());
Label lbl1 = new Label ("Choose your method");
jpl.add(lbl1, BorderLayout.NORTH);
CheckboxGroup g = new CheckboxGroup();
final Checkbox file = new Checkbox("From file", g, false);
final Checkbox form = new Checkbox("From Form", g, true);
jpl.add(file, BorderLayout.CENTER);
jpl.add(form, BorderLayout.SOUTH);
f.add(jpl, BorderLayout.NORTH);
Panel jpl1=new Panel ();
jpl1.setSize(200,200);
f.add(jpl1, BorderLayout.CENTER);
jpl1.setLayout(new BorderLayout());
jpl1.show();
final TextField txtar=new TextField ("Введите данные");
jpl1.add(txtar, BorderLayout.NORTH);
txtar.addActionListener(new ActionListener(){
public void actionPerformed (ActionEvent e)
{
System.exit(0);
}
});
jpl.show();
file.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent arg0) {
if (file.getState())
txtar.setEditable(false);
}
});
form.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent arg0) {
if (form.getState())
txtar.setEditable(true);
}
});
Проанализируем код. В первых трех строках описывается контейнер типа panel с именем jpl. Его размер задается равным 200x200. Размещение компонентов на нем задается шаблоном BorderLayout. Далее в четвертой и пятой строках добавляется надпись «Choose your method». В шестой строке мы добавляем набор переключателей CheckboxGroup с именем g. В эту группу входят два переключателя: file (с надписью «From file») и form (с надписью «From form»). В строке 12 добавляется еще один контейнер Panel с именем jpl1. На нем размещается текстовое поле ввода TextField txtar, в которе пользователь будет вводить некоторые данные. В конце программы описываются две подпрограммы обработки события изменения состояния переключателей. В случае изменения состояния любого из двух переключателей программа проверяет, не является ли он включенным. Если включен переключатель «From form», то поле становится активным. Если включен переключатель «From file», то поле становится неактивным для ввода. Самостоятельно разобраться с обработчиком события для текстового поля. Вид формы приведен на рис.9.
Рис.9. Форма с переключателем
Далее надо запустить программу. Для этого добавим на наш контейнер f еще одну панель с кнопкой btn1 (рис.10):
Panel jpl2=new Panel ();
jpl2.setSize(200,200);
f.add(jpl2, BorderLayout.SOUTH);
jpl2.setLayout(new BorderLayout());
jpl2.show();
Button btn1=new Button ("ПУСК");
jpl2.add(btn1, BorderLayout.NORTH);
Рис.10. Форма с кнопкой
Предположим, что наше приложение будет реализовывать расчет суммы N первых членов ряда следующего вида:
(1)
Очевидно, что для расчета необходимо ввести значение N. Его-то мы и будем получать из полей формы, либо из текстового файла. Ниже приведен код для обработки события нажатия кнопки. Предполагается, что sum, iterac и str – глобальные переменные (поля класса):
btn1.addActionListener(new ActionListener(){
public void actionPerformed (ActionEvent e)
{
if (file.getState()){
try {
BufferedReader in = new BufferedReader(new FileReader("C:/1.txt"));
final Checkbox file = new Checkbox("From file", g, false);
final Checkbox form = new Checkbox("From Form", g, true);
jpl.add(file, BorderLayout.CENTER);
jpl.add(form, BorderLayout.SOUTH);
f.add(jpl, BorderLayout.NORTH);
Panel jpl1=new Panel ();
jpl1.setSize(200,200);
f.add(jpl1, BorderLayout.CENTER);
jpl1.setLayout(new BorderLayout());
jpl1.show();
final TextField txtar=new TextField ("12");
jpl1.add(txtar, BorderLayout.NORTH);
txtar.addActionListener(new ActionListener(){
public void actionPerformed (ActionEvent e)
{
System.exit(0);
}
});
jpl.show();
file.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent arg0) {
if (file.getState())
txtar.setEditable(false);
}
});
form.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent arg0) {
if (form.getState())
txtar.setEditable(true);
}
});
Panel jpl2=new Panel ();
jpl2.setSize(200,200);
f.add(jpl2, BorderLayout.SOUTH);
jpl2.setLayout(new BorderLayout());
jpl2.show();
Button btn1=new Button ("ПУСК");
jpl2.add(btn1, BorderLayout.NORTH);
btn1.addActionListener(new ActionListener(){
public void actionPerformed (ActionEvent e)
{
if (file.getState()){
try {
BufferedReader in = new BufferedReader(new FileReader("C:/1.txt"));
str = in.readLine();
in.close();
} catch (IOException e1) {
}}
if (form.getState())
str=txtar.getText();
iterac=Integer.parseInt(str);
for (int i=1;i<=iterac;i++){
sum=sum-1/(float)(i*i);
}
System.out.println(sum);
}
});
}
}
ЗАДАНИЕ: разработать приложение, реализующее некоторый расчетный алгоритм с обязательным использованием циклов в расчете. Хотя бы одно значение для расчета должно вводиться через форму либо считываться из текстового файла с возможностью выбора. Вывод рассчитанного значения должен быть произведен на НОВОЙ (созданной) форме, также рассчитанное значение должно быть сохранено в текстовый файл. Формула рассчитываемого алгоритма должны быть приведена на форме.
ЛИТЕРАТУРА
1. Арнольд К., Гослинг Дж. Язык программирования JAVA. – Питер: СПб, 1997. – 304 с.
2. В. Фесюнов. Конспект лекций по Java. Электронный учебник, 2000. – 242 с.
3. Картузов А.В. Программирование на языке Java. Электронный учебник. 1999 – 170 с.
4. Флэнаган Д. Java в примерах. Справочник. 2-е изд. - Символ-Плюс: СПБ, 2003. – 664 с.
5. Эккель Б. Философия Java. Библиотека программиста. 4-е изд. – Питер: СПБ, 2009. – 640 с.: илл.