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

7. Разработка собственных объектов.

В большинстве случаев, при разработки приложений, необходимо создавать собственные объекты. Это обусловлено тем, что язык Javaявляется объектно-ориентированным и вся обработка информации происходит на уровне объекта. В общем случае описание объекта имеет следующий вид:

package имя пакета;

// Подключение библиотек, используемых новым компонентом

class имя компонента extends имя базового компонента

{

// свойства и методы нового компонента

};

Объекты могут быть визуальными, то есть видимыми на форма и невидимыми, то есть хранящиеся в только в памяти.

Рассмотри построение собственного визуального компонента на примере объекта вывода графика функции. В качестве базового компонента будем использовать класс JPanel.

package имя пакета;

// Библиотека базового класса нашего компонента

import javax.swing.JPanel;

// Библиотека класса графических примитивов

import java.awt.Graphics;

// Библиотека сервисных функций шрифтов

import java.awt.FontMetrics;

// Библиотека палитры.

import java.awt.Color;

// Библиотека математических функций

import java.lang.Math;

// Создаем компонент.

class имя компонента extends JPanel

{

// Определение переменных

// Определяем массив для хранения значений оси X.

private double val_x[]=null;

// Определяем массив для хранения значений оси Y.

private double val_y[]=null;

// Определяем переменные ограничивающие размеры графика

// по оси X и Y.

private double Xmin=0;

private double Xmax=0;

private double Ymin=0;

private double Ymax=0;

};

// Конструктор класса

public имя компонента() {

// Устанавливаем цвет фона данного компонента

this.setBackground(Color.white);

}

// Установка и первичная обработка данных

// для построения графика

void setDataGraph(double _val_x[],double _val_y[])

{

// Устанавливаем значения массивов

val_x=_val_x;

val_y=_val_y;

// Вычисляем диапазон по оси X

if(vay_x!=null)

{

Xmin=val_x[0];

Xmax=val_x[0];

For(int i=0;i<val_x.length;i++)

{

if(Xmin>val_x[i])Xmin=val_x[i];

if(Xmax<val_x[i])Xmax=val_x[i];

}

}

else

{

Xmin=0;

Xmax=0;

}

// Вычисляем диапазон по оси Y

if(val_y!=null)

{

Ymin=val_y[0];

Ymax=val_y[0];

for(int i=1;i<val_y.length;i++)

{

if(Ymin>val_y[i])Ymin=val_y[i];

if(Ymax<val_y[i])Ymax=val_y[i];

}

}

else

{

Ymin=0;

Ymax=0;

}

// Увиличиваем диапазон, для предотвращения выхода

// за пределы окна по оси X

double delta=Math.abs(Xmax-Xmin)*0.05;

Xmin-=delta;

Xmax+=delta;

// Увиличиваем диапазон, для предотвращения выхода

// за пределы окна по оси Y

delta=Math.abs(Ymax-Ymin)*0.05;

Ymin-=delta;

Ymax+=delta;

// Вызываем перерисовку, для отображения полученных результатов

this.repaint();

}

// В большинстве случаем при построении каких либо графиков или диаграмм

// необходимо преобразовывать (приводить) исходные данные к пространству

// компонентов. Для этого необходимо вычислить коэффициенты

// масштабирования (множители) приведения и положение нулевой точки

// координат.

// По оси X коэффициент приведения вычисляется как отношение ширины

// компонента к диапазону X, а по оси Y как отношение высоты компонента

// к диапазону по оси Y

// Определение коэффициента масштабирования

// по оси X

private double GetKmX()

{

double space_x=Xmax-Xmin;

if(space_x==0)return 0;

return (double)this.getWidth()/space_x;

}

// Определение коэффициента масштабирования

// по оси Y

private double GetKmY()

{

double space_y=Ymax-Ymin;

if(space_y==0)return 0;

return (double)this.getHeight()/space_y;

}

// Определение положения нулевой точки

// по оси X

private int GetCenterX()

{

double tmp=0;

if(Xmin<0 && Xmax>0)tmp=-Xmin*GetKmX();

else if(Xmax<0)tmp=(double)this.getWidth();

return (int)tmp;

}

// Определение положения нулевой точки

// по оси Y

private int GetCenterY()

{

double tmp=0;

if(Ymin<0 && Ymax>0)tmp=this.getHeight()-(-Ymin*GetKmY());

else if(Ymax<0)tmp=(double)this.getHeight();

return (int)tmp;

}

// Далее идет описание функций определения положения точки

// приведенной к размерам окна и положению центра координат

// Получение значения абсциссы приведенной к размерам окна

private int GetX(int idx)

{

if(val_x==null)return 0;

int i_pos=(int)(double)(val_x[idx]*GetKmX());

return GetCenterX()+i_pos;

}

// Получение значения ординаты приведенной к размерам окна

private int GetY(int idx)

{

if(val_y==null)return 0;

int i_pos=(int)(double)(val_y[idx]*GetKmY());

return GetCenterY()-i_pos;

}

// Поскольку в языке Java пока отсутствуют функции форматированного

// ввода-вывода то необходимо описать функцию преобразования

// вещественного числа в строку по указанному формату.

// Функция преобразования вещественного числа в строку.

private String float_to_str(double val,String format)

{

int idx_dec=format.indexOf('.');

if(idx_dec==-1)return String.valueOf(val);

String dec_str=format.substring(idx_dec+1);

int cnt_dec=0;

for(int i=0;i<dec_str.length();i++)

{

if(dec_str.charAt(i)!='0')break;

cnt_dec++;

}

double prepare_f=val;

double delta=0.5;

for(int i=0;i<cnt_dec;i++)delta/=10;

prepare_f+=delta;

String fl_str=String.valueOf(prepare_f);

int idx_int=fl_str.indexOf(',');

if(idx_int==-1)idx_int=fl_str.indexOf('.');

String base=fl_str;

String expn="";

if(idx_int!=-1)base=fl_str.substring(0,idx_int);

if(idx_int!=-1)expn=fl_str.substring(idx_int+1);

while(expn.length()<cnt_dec)

{

expn+="0";

}

fl_str=base+","+expn.substring(0,cnt_dec)+dec_str.substring(cnt_dec);

return fl_str;

}

// Далее идет функция рисования координатных осей

private void draw_coord(Graphics g,int mode)

{

Color save_color=g.getColor(); // Сохраняем текущий цвет

g.setColor(Color.black); // Устанавливаем черный цвет осей

double delta_x=0;

double delta_y=0;

FontMetrics fm=g.getFontMetrics(); // Определяем параметры шрифта

if(mode==0)

{

// Рисование оси Y

g.drawLine(GetCenterX()-1,4,GetCenterX()-1,this.getHeight()-3);

g.drawLine(GetCenterX(),3,GetCenterX(),this.getHeight()-3);

g.drawLine(GetCenterX()+1,4,GetCenterX()+1,this.getHeight()-3);

g.drawLine(GetCenterX()-5,13,GetCenterX(),3);

g.drawLine(GetCenterX()+5,13,GetCenterX(),3);

// Вывод заголовка метки оси Y

g.drawString("Y",GetCenterX()+10,fm.getHeight()+3);

delta_y=Math.max(Math.abs(Ymin),Math.abs(Ymax))/10;

delta_y=Math.ceil(delta_y*10)/10;

}

else

{

// Рисование оси X

g.drawLine(3,GetCenterY()-1,this.getWidth()-4,GetCenterY()-1);

g.drawLine(3,GetCenterY(),this.getWidth()-3,GetCenterY());

g.drawLine(3,GetCenterY()+1,this.getWidth()-4,GetCenterY()+1);

g.drawLine(this.getWidth()-13,GetCenterY()-5,

this.getWidth()-3,GetCenterY());

g.drawLine(this.getWidth()-13,GetCenterY()+5,

this.getWidth()-3,GetCenterY());

// Вывод заголовка метки оси X

g.drawString("X",this.getWidth()-fm.charWidth('X')*2,

GetCenterY()+fm.getHeight());

delta_x=Math.max(Math.abs(Xmin),Math.abs(Xmax))/10;

delta_x=Math.ceil(delta_x*10)/10;

}

// Вывод масштабных линий

double tmp_x=delta_x;

double tmp_y=delta_y;

for(int i=0;i<10;i++)

{

if(delta_x!=0)

{

int i_pos=(int)((double)tmp_x*GetKmX());

String txt=float_to_str(tmp_x,"0.0");

if(tmp_x<Math.abs(Xmin))

{

g.drawLine(GetCenterX()-i_pos,GetCenterY()-5,

GetCenterX()-i_pos,GetCenterY()+5);

if((i%2)==0)

{

g.drawString("-"+txt,GetCenterX()-i_pos-

fm.stringWidth("-"+txt)/2,GetCenterY()+fm.getHeight());

}

}

if(tmp_x<Math.abs(Xmax))

{

g.drawLine(GetCenterX()+i_pos,GetCenterY()-5,

GetCenterX()+i_pos,GetCenterY()+5);

if((i%2)==0)

{

g.drawString(txt,GetCenterX()+i_pos-

fm.stringWidth(txt)/2,GetCenterY()+fm.getHeight());

}

}

}

if(delta_y!=0)

{

int i_pos=(int)((double)tmp_y*GetKmY());

String txt=float_to_str(tmp_y,"0.0");

if(tmp_y<Math.abs(Ymin))

{

g.drawLine(GetCenterX()-5,GetCenterY()+i_pos,

GetCenterX()+5,GetCenterY()+i_pos);

if((i%2)==0)

{

g.drawString("-"+txt,GetCenterX()-5-

fm.stringWidth("-"+txt),

GetCenterY()+i_pos+fm.getHeight()/2);

}

}

if(tmp_y<Math.abs(Ymax))

{

g.drawLine(GetCenterX()-5,GetCenterY()-i_pos,

GetCenterX()+5,GetCenterY()-i_pos);

if((i%2)==0)

{

g.drawString(txt,GetCenterX()-5-

fm.stringWidth(txt),

GetCenterY()-i_pos+fm.getHeight()/2);

}

}

}

tmp_x+=delta_x;

tmp_y+=delta_y;

}

g.setColor(save_color);

if(mode==0)draw_coord(g,1);

}

// Функция рисования графика. Функция paint является виртуальной

// функцией класса JPanel. При определении виртуальной функции, вызов

// будет происходить аналогично языку C++

public void paint(Graphics g)

{

super.paint(g);

if(val_x==null || val_y==null)return;

draw_coord(g,0);

Color save_color=g.getColor();

g.setColor(Color.red);

int save_x=GetX(0);

int save_y=GetY(0);

for(int i=1;i<val_x.length-1;i++)

{

g.drawLine(save_x,save_y,GetX(i),GetY(i));

save_x=GetX(i);

save_y=GetY(i);

}

g.setColor(save_color);

}

}

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