- •Федеральное агентство по образованию рф
- •2. Организация программ на языке Java.
- •2.1. Обработка критических ошибок и методы их локализации в языке Java..
- •3. Ввод/вывод данных в консольном режиме.
- •4. Одномерные массивы.
- •5. Двумерные массивы.
- •Int a[][];
- •6. Разработка приложений на языке Java.
- •7. Разработка собственных объектов.
- •7.1. Объекты управления
- •8. Разработка аплитов.
- •9. Параллельные потоки в языке Java.
- •10. Использование таблиц при программировании на языке Java.
- •11. Файловый ввод-вывод в приложениях
- •Список рекомендуемой литературы
7.1. Объекты управления
К объектам управления в языке Javaотносятся все компоненты, имеющие обработчики событий. В большинстве случаев в качестве объектов управления используются кнопки, меню, панели управления. В общем случае управление поведением программы имеет структуру приведенную на рисунке 1:

Рис. 1. Структурная схема обработки событий
На данном рисунку К.У.– компонент управления, аО – управляемый объект. Из рисунка видно, что компонент управления передает команду форме, а форма уже распределяет эти команды в зависимости от принадлежности соответствующим компонентам.
Стандартные компоненты управления приведены в таблице 4.
Таблица 4. Стандартные компоненты управления.
|
Компонент |
Комментарии |
|
JButton |
Кнопка библиотеки SWING. Событие генерируется при нажатии кнопки. |
|
JRadioButton |
Кнопка выбора варианта библиотеки SWING. Событие генерируется при изменении состояния кнопки. |
|
JCheckBox |
Кнопка флага библиотеки SWING. Событие генерируется при изменении состояния кнопки. |
|
JMenuItem |
Строка меню SWING. Событие генерируется при выборе пункта меню. |
|
Button |
Кнопка библиотеки AWT. Событие генерируется при нажатии кнопки. |
|
RadioButton |
Кнопка выбора варианта библиотеки AWT. Событие генерируется при изменении состояния кнопки. |
|
CheckBox |
Кнопка флага библиотеки AWT. Событие генерируется при изменении состояния кнопки. |
|
MenuItem |
Строка меню AWT. Событие генерируется при выборе пункта меню. |
В общем случае любой компонент может генерировать события, в зависимости от его назначения. Язык Javaпозволяет обрабатывать все события мыши и клавиатуры, в зависимости от их необходимости.
Так рассмотрим обработку событий формы на примере формы построения графика функции. Предположим, что нам задана функция:

и в результате мы хотим получить приложение выполняющее построение графика этой функции следующего вида:

Рис.2.
На данной форме расположены окна редактирования, в которые вводятся исходные параметры для построения графика, компонент управления (кнопка «Обработать») и управляемый объект (область построения графика). Целью формы является связь визуальных компонентов (управляющих и управляемых) между собой. Программа связи компонентов будет иметь следующий вид:
package имя пакута;
// Подключение необходимых библиотек:
// Подключаем стандартную библиотеку работы с окнами
import java.awt.*;
// Подключаем стандартную библиотеку обработки событий
// окон, она необходима для обработки системных сообщений
import java.awt.event.*;
// Подключаем расширенную библиотеку работы с окнами
import javax.swing.*;
// Подключаем библиотеку позиционирования
import com.borland.jbcl.layout.*;
// Класс-оболочку для преобразования вещественных чисел
import java.lang.Double;
// Класс математических функций
import java.lang.Math;
// Описываем класс формы, используя базовым классом
// класс расширенной библиотеки работы с окнами.
public class имя формы extends JFrame {
JPanel contentPane; // Переменная связанная с корневой панелью формы
// Создаем объект позиционирования компонентов на форме
BorderLayout borderLayout1 = new BorderLayout();
// Создаем объект, на котором будут располагать компоненты управления
JPanel tool_panel = new JPanel();
// Объект позиционирования компонентов на контейнере управления
XYLayout xYLayout1 = new XYLayout();
// Создаем метки и поля редактирования для ввода исходных данных.
JLabel a_label = new JLabel();
JTextField a_text = new JTextField();
JLabel b_label = new JLabel();
JTextField b_text = new JTextField();
JLabel c_label = new JLabel();
JTextField c_text = new JTextField();
JLabel xn_label = new JLabel();
JTextField xn_text = new JTextField();
JLabel xk_label = new JLabel();
JTextField xk_text = new JTextField();
JLabel dx_label = new JLabel();
JTextField dx_text = new JTextField();
// Создаем компонент управления
JButton update_btn = new JButton();
// Создаем объект отображения графической информации, в нашем
// случае управляемый объект описанный выше.
Имя класса graph=new Имя класса();
// Описываем переменные для ввода исходных данных
double val_x[]=null;
double val_y[]=null;
// Конструктор класса
public имя формы() {
// Устанавливаем перехватчик событий окон, в нашем случае необходим
// для обработки системной команды закрытия окна.
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
// Инициализируем компоненты.
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
// Функция инициализации компонентов
private void jbInit() throws Exception {
// Получаем корневую панель формы
contentPane = (JPanel) this.getContentPane();
// Устанавливаем способ позиционирования компонентов на форме
contentPane.setLayout(borderLayout1);
// Устанавливаем размеры окна и его заголовок
this.setSize(new Dimension(550, 400));
this.setTitle("Построение графиков функций");
// Устанавливаем параметры контейнера компонентов управления
tool_panel.setBorder(BorderFactory.createEtchedBorder());
tool_panel.setMinimumSize(new Dimension(10, 27));
tool_panel.setPreferredSize(new Dimension(10, 27));
tool_panel.setLayout(xYLayout1);
// Определяем параметры меток и полей ввода исходных данных
a_label.setText("A:");
a_text.setMinimumSize(new Dimension(35, 21));
a_text.setPreferredSize(new Dimension(35, 21));
a_text.setText("100");
b_label.setText("B:");
b_text.setText("5");
b_text.setPreferredSize(new Dimension(35, 21));
b_text.setMinimumSize(new Dimension(35, 21));
c_label.setText("C:");
c_text.setMinimumSize(new Dimension(35, 21));
c_text.setPreferredSize(new Dimension(35, 21));
c_text.setText("150");
xn_label.setText("Xнач:");
xn_text.setText("-20");
xn_text.setPreferredSize(new Dimension(35, 21));
xn_text.setMinimumSize(new Dimension(35, 21));
xk_label.setText("Xкон:");
xk_text.setMinimumSize(new Dimension(35, 21));
xk_text.setPreferredSize(new Dimension(35, 21));
xk_text.setText("30");
dx_text.setText("1");
dx_text.setPreferredSize(new Dimension(35, 21));
dx_text.setMinimumSize(new Dimension(35, 21));
dx_label.setText("DX:");
// Определяем параметры компонента управления
update_btn.setBorder(BorderFactory.createEtchedBorder());
update_btn.setMaximumSize(new Dimension(75, 23));
update_btn.setMinimumSize(new Dimension(75, 23));
update_btn.setPreferredSize(new Dimension(73, 23));
update_btn.setText("Обработать");
// Устанавливаем компоненту управления, класс обработки события нажатия
// на него.
update_btn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
update_btn_actionPerformed(e);
}
});
// Закрепляем панель управления на форме
contentPane.add(tool_panel, BorderLayout.NORTH);
// Закрепляем компоненты ввода исходных данных на панели управления
tool_panel.add(a_label, new XYConstraints(2, 2, -1, -1));
tool_panel.add(a_text, new XYConstraints(16, 0, -1, -1));
tool_panel.add(b_label, new XYConstraints(54, 2, -1, -1));
tool_panel.add(c_text, new XYConstraints(123, 0, -1, -1));
tool_panel.add(b_text, new XYConstraints(69, 0, -1, -1));
tool_panel.add(c_label, new XYConstraints(107, 2, -1, -1));
tool_panel.add(xn_label, new XYConstraints(161, 2, -1, -1));
tool_panel.add(xn_text, new XYConstraints(195, 0, -1, -1));
tool_panel.add(xk_label, new XYConstraints(233, 2, -1, -1));
tool_panel.add(xk_text, new XYConstraints(267, 0, -1, -1));
tool_panel.add(dx_label, new XYConstraints(305, 2, -1, -1));
tool_panel.add(dx_text, new XYConstraints(328, 0, -1, -1));
// Закрепляем компонент управления на парели управления
tool_panel.add(update_btn, new XYConstraints(368, 0, -1, -1));
// Устанавливаем параметры компонента отображения информации
graph.setBorder(BorderFactory.createEtchedBorder());
// Закрепляем компонент отображения информации на форме
contentPane.add(graph, BorderLayout.CENTER);
}
// Создаем обработчик системных событий, в нашем случае для обработки
// события закрытия окна
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
// Создаем функцию получения исходных данных в требуемом формате
private double get_float_field(JTextField fld)
{
return Double.valueOf(fld.getText()).doubleValue();
}
// Описываем реакцию на нажатие кнопки (компонента управления)
void update_btn_actionPerformed(ActionEvent e) {
// Получаем исходные данных
double a=get_float_field(a_text);
double b=get_float_field(b_text);
double c=get_float_field(c_text);
double xn=get_float_field(xn_text);
double xk=get_float_field(xk_text);
double dx=get_float_field(dx_text);
// вычисляем значения функции
if(dx==0)
{
graph.setDataGraph(null,null);
JOptionPane.showMessageDialog(this,"Интервал не может равняться нулю!",
this.getTitle(),JOptionPane.ERROR_MESSAGE);
return;
}
if((xn>xk && dx>0) || (xn<xk && dx<0))
{
graph.setDataGraph(null,null);
JOptionPane.showMessageDialog(this,"Интервал или приращение заданы неверно!"+
" Бесконечный цикл!",
this.getTitle(),JOptionPane.ERROR_MESSAGE);
return;
}
int count=(int)Math.abs((xk-xn)/dx);
val_x=new double[count];
val_y=new double[count];
if(val_x==null || val_y==null)
{
graph.setDataGraph(null,null,0,0);
JOptionPane.showMessageDialog(this,"Ошибка выделения памяти!",
this.getTitle(),JOptionPane.ERROR_MESSAGE);
return;
}
double x=xn;
if(xn>xk)
{
double tmp=xn;
xk=xn;
xn=tmp;
dx*=-1;
}
int i=0;
boolean null_flag;
while(x<=xk && i<(val_x.length-1))
{
null_flag=false;
val_x[i]=x;
if(b<15 && x!=0)val_y[i]=a-b*x;
else
{
if(b>15 && x==0)
{
if((c-b*x)==0)
{
null_flag=true;
}
else val_y[i]=a*(b+x)/(c-b*x);
}
else
{
if(c==0)
{
null_flag=true;
}
else val_y[i]=(c+x)/(-1*c);
}
}
if(null_flag)
{
JOptionPane.showMessageDialog(this,
"Функция имеет точку разрыва. Система остановлена!",
this.getTitle(),JOptionPane.ERROR_MESSAGE);
return;
}
x+=dx;
i++;
}
// передаем параметры компоненту отображения информации.
graph.setDataGraph(val_x,val_y);
}
}
Структурная схема работы данной формы имеет следующий вид:

Рис.3.
На данной схеме видно, что вся работа приложения представляет собой цикл, состоящий из четырех состояний:
Ожидание команды (ожидание действий пользователя, определенных в программе в нашем случае нажатия кнопки);
Обработка получение исходных данных;
Обработка исходных данных;
Вывод результатов.
