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