Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
230102 5к / СПО / УПП.doc
Скачиваний:
58
Добавлен:
20.04.2015
Размер:
465.41 Кб
Скачать

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.

На данной схеме видно, что вся работа приложения представляет собой цикл, состоящий из четырех состояний:

  • Ожидание команды (ожидание действий пользователя, определенных в программе в нашем случае нажатия кнопки);

  • Обработка получение исходных данных;

  • Обработка исходных данных;

  • Вывод результатов.

Соседние файлы в папке СПО