субота, 7 липня 2012 р.

Робота з графічним інтерфейсом користувача

У цій роботі для створення програми графічного пристрою нам знадобиться чотири класи, які знаходитимуться в різних файлах. Для того, щоб надалі уникнути плутанини, необхідно дані
файли помістити в окрему теку (чи, в інтерпретації платформи Eclipse, в окремий підпакет).

Створимо нову теку, клацнувши правою кнопкою миші на імені проекту в уявленні Package explorer, і в меню, що розкрилося, вибравши пункт "папку". Назвемо її "MyGraph". Потім в цій теці аналогічно створимо чотири нових класи:


  • "Графика" - головний клас, в якому буде метод main ().
  • "Синус" - клас графіку синуса.
  • "Косинус" - клас графіку косинуса.
  • "X2" - клас графіку параболи.






Клас Графический

package MyGraph;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
public class Graphic extends JFrame{
Graphic(String s){
super(s);
setLayout(null);
setSize(120,200);
setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setResizable(false);
Button sin = new Button("Sin");
sin.setBounds(5, 20, 100, 25);
add(sin);
Button cos = new Button("Cos");
cos.setBounds(5, 70, 100, 25);
add(cos);
Button x2 = new Button("Парабола");
x2.setBounds(5, 120, 100, 25);
 add(x2);
 sin.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent event){
 new Sinus("Синус");
 }
 });
 cos.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent event){
 new Cosinus("Косинус");
 }
 });
 x2.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent event){
 new X2("Парабола");
 }
 });
 }
 public static void main(String[] args) {
 new Graphic("Графопостроитель");
 }

 }

Клас Sinus

package MyGraph;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Sinus extends JFrame{
Sinus(String s){
super(s);
setLayout(null);
setSize(600,300);
setVisible(true);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setResizable(false);
this.setLocation(100, 100);
}
public void paint(Graphics gr){
int y; int j=0; int k=0;
gr.setColor(Color.WHITE);
gr.fillRect(0, 0, 600, 300);
gr.setColor(Color.lightGray);
while(j<600){
gr.drawLine(j, 0, j, 300);
j+=30;
}
while(k<300){
 gr.drawLine(0, k, 600, k);
 k+=30;
 }
 gr.setColor(Color.BLACK);
 gr.drawLine(300, 0, 300, 300);
 gr.drawLine(0, 150, 600, 150);
 gr.drawLine(120, 140, 120, 160);
 gr.drawLine(480, 140, 480, 160);
 gr.drawString("0", 305, 165);
 gr.drawString("-"+"\u03c0", 125, 140);
 gr.drawString("\u03c0", 485, 140);
 gr.setColor(Color.RED);
 for(double i=0;i<1000;i++){
 y=(int)(80*Math.sin(Math.PI*i/180));
 gr.drawLine((int)i-240, y+150, (int)i-240, y+150);
 }
 gr.dispose();
 }

}

Класс Косинус

package MyGraph;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Cosinus extends JFrame{
Cosinus(String s){
super(s);
setLayout(null);
setSize(600,300);
setVisible(true);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setResizable(false);
this.setLocation(200, 200);
}
public void paint(Graphics gr){
 int y; int j=0; int k=0;
 gr.setColor(Color.WHITE);
 gr.fillRect(0, 0, 600, 300);
 gr.setColor(Color.lightGray);
 while(j<600){
 gr.drawLine(j, 0, j, 300);
 j+=30;
 }
 while(k<300){
 gr.drawLine(0, k, 600, k);
 k+=30;
 }
 gr.setColor(Color.BLACK);
 gr.drawLine(300, 0, 300, 300);
 gr.drawLine(0, 150, 600, 150);
 gr.drawLine(120, 140, 120, 160);
 gr.drawLine(480, 140, 480, 160);
 gr.drawString("0", 305, 165);
 gr.drawString("-"+"\u03c0", 125, 140);
 gr.drawString("\u03c0", 485, 140);
 gr.setColor(Color.RED);
 for(double i=0;i<1000;i++){
 y=(int)(80*Math.cos(Math.PI*i/180));
 gr.drawLine((int)i-240, y+150, (int)i-240, y+150);
 }
 gr.dispose();
 }
 }


Класс X2


package MyGraph;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class X2 extends JFrame{
X2(String s){
super(s);
setLayout(null);
setSize(600,300);
setVisible(true);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setResizable(false);
this.setLocation(300, 300);
}
public void paint(Graphics gr){
int y; int j=0; int k=0;
gr.setColor(Color.WHITE);
gr.fillRect(0, 0, 600, 300);
gr.setColor(Color.lightGray);
while(j<600){
gr.drawLine(j, 0, j, 300);
j+=50;
}
while(k<300){
gr.drawLine(0, k, 600, k);
k+=50;
}
gr.setColor(Color.BLACK);
gr.drawLine(300, 0, 300, 300);
gr.drawLine(0, 150, 600, 150);
gr.drawString("0", 305, 165);
 gr.setColor(Color.RED);
 for(double i=0;i<1000;i++){
 y=-(int)(i*i/300)+150;
 gr.drawLine((int)i+300, y, (int)i+300, y);
 gr.drawLine(-(int)i+300, y, -(int)i+300, y);
 }
 gr.dispose();
 }
 }





У класі Graphics описано вікно розміром 120х200, в якому розміщено три кнопки. При натисканні на кнопку обробляється спеціальною процедурою, яка називається процедурою обробки події ActionEvent. При натисненні кнопки відбувається створення нової форми, в якій буде побудований відповідний графік елементарной функції.
Класи обробки подій описані усередині параметра методу додавання слухача addActionListener(). Цікаво, що параметром цього методу є новий об'єкт інтерфейсу ActionListener з одним методом actionPerformed (), який і відповідає за поведінку програми, у випадку якщо буде викликана ця подія (натискання на кнопку).


У класах, які роблять побудову графіків, в рядках 20-27 з використанням двох циклів відбувається побудова координатний сітки світло-сірим кольором, потім чорним кольором будуються осі абсцисс і ординат.
Найбільший інтерес представляють рядки 37-40 (для синуса і косинуса) і 33-37 (для параболи) в яких відбувається малювання графіків. Синус і косинус малюються аналогічно: спочатку обчислюється значення y і методом drawString () малюється "лінія" завдовжки в один піксель. Координата y обчислюється шляхом явного перетворення типу double в тип int, отриманого в результаті виконання виразу 80*Math.cos (Math.PI*i/180).
Парабола будується аналогічним чином, в два етапи. На першому етапі будується додатня частина параболи і далі від'ємна.


Немає коментарів:

Дописати коментар