Tải bản đầy đủ (.doc) (26 trang)

BÀI TẬP LỚN MÔN LẬP TRÌNH JAVA Tìm hiểu về đồ họa trong Java vẽ chữ, vẽ hình 2D và 3D. Viết chương trình vẽ một số hình (chữ nhật, tròn, trụ, lập phương) với kích thước và màu sắc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (374.64 KB, 26 trang )

TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
&
BÀI TẬP LỚN
MÔN LẬP TRÌNH JAVA
Đề tài 6: “Tìm hiểu về đồ họa trong Java: vẽ chữ, vẽ hình
2D và 3D. Viết chương trình vẽ một số hình (chữ nhật,
tròn, trụ, lập phương) với kích thước và màu sắc do người
sử dụng xác định.”
Giảng viên hướng dẫn: Ngô Công Thắng
Nhóm sinh viên thực hiện: Nguyễn Thị Huyền
Chu Thị Thanh Hương
Vũ Thị Thùy Linh
Nguyễn Thị Xuân
HÀ NỘI – 2010
A.TÌM HIỂU VỀ ĐỒ HOẠ TRONG JAVA: VẼ
CHỮ, VẼ HÌNH 2D VÀ 3D
Một khả năng của Java là cho phép ta xây dựng các ứng
dụng có giao diện đồ hoạ hay còn gọi là GUI(Grapthical User
Interface). Khi Java được phát hành, các thành phần đồ hoạ
được tập trung vào thư viện mang tên Abstract Window
Toolkit (AWT). Đối với mỗi hệ nền, thành phần AWT sẽ được
ánh xạ sang một thành phần nền cụ thể, bằng cách sử dụng
trực tiếp mã native của hệ nền, chính vì vậy nó phụ thuộc rất
nhiều vào hệ nền và nó còn có thể gây lỗi trên một số hệ
nền.
Với bản phát hành Java 2, các thành phần giao diện
được thay bằng tập hợp các thành phần linh hoạt, đă năng,
mạnh mẽ, độc lập với hệ nền thuộc thư viện Swing. Phần lớn
các thành phần trong thư viện Swing đều được tô vẽ trực tiếp
trên canvas bằng mã lệnh của Java, ngoại trừ các thành


phần là lớp con của lớp java.awt. Windown hoặc Java.awt.Panel vốn
phải được vẽ bằng GUI trên nền cụ thể. Thành phần Swing ít phụ thuộc vào
hệ nền hơn do vậy ít gặp lỗi hơn và đặc biệt nó sử dụng ít tài nguyên của hệ
thống hơn các thành phần trong thư viện awt. Mặc dù các thành phần awt
vẫn được hỗ trợ trong Java 2, tuy nhiên Sun khuyên bạn nên sử dụng các
thành phần Swing thay cho các thành phần awt, tuy nhiên các thành phần
trong thư viện Swing không thể thay tất cả các thành phần trong thư viện
awt. Chúng chỉ thay thế một phần awt như: Button, Panel, TextField, Còn
các lớp trợ giúp khác trong awt như: Graphics, Color, Font, FontMetrics, …
vẫn không thay đổi. Bên cạnh đó các thành phần Swing còn
sử dụng mô hình sử lý sự kiện của awt.
I. Giới thiệu về hệ thống đồ hoạ của Java
Thiết kết API cho lập trình đồ hoạ của Java là một ví dụ
hoàn hảo về cách dùng lớp, sự kết thừa và giao diện. API cho
lập trình đồ hoạ bao gồm một tập rất nhiều lớp nhằm trợ
giúp xây dựng các thành phần giao diện khác nhau như: cửa
sổ, nút ấn, ô văn bản, menu, hộp kiểm… Một quan hệ kế
thừa giữa các thành phần này được mô tả như sau:
1. Các khái niệm cơ bản
1.1. Component
Component là một đối tượng có biểu diễn đồ họa được hiển thị trên màn
hình mà người dùng có thể tương tác được. Chẳng hạn như những nút nhấn
(button), những checkbox, những scrollbar,… Lớp Component là một lớp
trừu tượng. là lớp cha của mọi lớp giao diện người dùng. Lớp
này cung cấp các thuộc tính, hành vi cơ bản nhất của tất cả
các thành phần giao diện.
1.2. Container
Container là đối tượng vật chứa hay những đối tượng có khả năng quản
lý và nhóm các đối tượng khác lại. Những đối tượng con thuộc thành phần
awt như: button, checkbox, radio button, scrollbar, list,… chỉ sử dụng được

khi ta đưa nó vào khung chứa (container).
Một số đối tượng container trong Java:
 Panel: Đối tượng khung chứa đơn giản nhất, dùng để nhóm các đối
tượng, thành phần con lại. Một Panel có thể chứa bên trong một Panel
khác.
 Frame: khung chứa Frame là một cửa số window hẳn hoi ở mức trên
cùng bao gồm một tiêu đều và một đường biên (border) như các ứng
dụng windows thong thường khác. Khung chứa Frame thường được
sử dụng để tạo ra cửa sổ chính của các ứng dụng.
 Dialogs: đây là một cửa sổ dạng hộp hội thoại (cửa sổ dạng này còn
được gọi là pop-up window), cửa sổ dạng này thường được dùng để
đưa ra thông báo, hay dùng để lấy dữ liệu nhập từ ngoài vào thông
qua các đối tượng, thành phần trên dialog như TextField chẳng hạn.
Dialog cũng là một cửa sổ nhưng không đầy đủ chức năng như đối
tượng khung chứa Frame.
 ScrollPanes: là một khung chứa tương tự khung chứa Panel, nhưng
có thêm 2 thanh trượt giúp ta tổ chức và xem được các đối tượng lớn
choán nhiều chỗ trên màn hình như những hình ảnh hay văn bản nhiều
dòng.
 Jcomponent: Là lớp cha của mọi thành phần Swing ligth weight,
được vẽ trực tiếp lên canvas bằng mã lệnh Java. Một lớp được kế thừa
từ lớp Jcomponent được thể hiện trong hình sau:
1.3. Graphics
Là lớp trừu tượng cung cấp ngữ cảnh đồ hoạ để vẽ các
đối tượng đồ hoạ như: đường thẳng, đường tròn, hình ảnh…
1.4. Color: lớp này biểu diễn một mầu sắc.
1.5. Font: lớp này biểu thị cho một font đồ hoạ.
1.6. FontMetrics: là một lớp trừu tượng dùng để xác định
các thuộc tính của Font. Tất cả các thành phần đồ hoạ trong
thư viện Swing được nhóm trong gói javax.swing. Đa số các

thành phần trong thư viện Swing đều có tiếp đầu ngữ là ‘J’,
Ví dụ: một nút lệnh trong thư viện Swing có tên là JButton,
một memu có tên là JMenu.
Chú ý: không được pha trộn các thành phần giao diện
swing và awt trong cùng một ứng dụng. Chẳng hạn như
không nên đặt một JButton vào một Panel và không nên đặt
Button vào JPanel. Việc làm này có thể gây lỗi.
1.7. Layout Manager
Khung chứa container nhận các đối tượng từ bên ngoài đưa vào và nó
phải biết làm thế nào để tổ chức sắp xếp “chỗ ở” cho các đối tượng đó. Mỗi
đối tượng khung chứa đều có một bộ quản lý chịu trách nhiệm thực hiện
công việc đấy đó là bộ quản lý trình bày (Layout Manager). Các bộ quản lý
trình bày mà thư viện AWT cung cấp cho ta bao gồm:
 FlowLayout: Sắp xếp các đối tượng từ trái qua phải và từ trên
xuống dưới. Các đối tượng đều giữ nguyên kích thước của mình. .
Cách sắp xếp này là mặc định đối với Panel, JPanel
,Applet và JApplet.
 BorderLayout: Các đối tượng được đặt theo các đường viền của
khung chứa theo các cạnh West, East, South, North và Center tức
Đông, Tây, Nam, Bắc và Trung tâm hay Trái, Phải, Trên, Dưới và
Giữa tùy theo cách nhìn của chúng ta. Cách sắp xếp này là mặc định
đối với lớp Window, Frame, JFrame, Dialog và JDialog
 GridLayout: Tạo một khung lưới vô hình với các ô bằng nhau. Các
đối tượng sẽ đặt vừa kích thước với từng ô đó. Thứ tự sắp xếp cũng từ
trái qua phải và từ trên xuống dưới. Mỗi thành phần giao diện
chứa trong một ô.
 GridBagLayout: Tương tự như GridLayout, các đối tượng khung
chứa cũng được đưa vào một lưới vô hình. Tuy nhiên kích thước các
đối tượng không nhất thiết phải vừa với 1 ô mà có thể là 2, 3 ô hay
nhiều hơn tùy theo các ràng buộc mà ta chỉ định thông qua đối tượng

GridBagConstraint.
 Null Layout: Cách trình bày tự do. Đối với cách trình bày này người
lập trình phải tự động làm tất cả từ việc định kích thước của các đối
tượng, cũng như xác định vị trí của nó trên màn hình. Ta không phụ
thuộc vào những ràng buộc đông, tây , nam, bắc gì cả.
II. Vẽ chữ
1. Một số khái niệm liên quan
-Font: là 1 tập hoàn chỉnh các chữ cái, các con số, các dấu câu, và các kí tự
đặc biệt, theo một kiểu loại, định dạng (đậm, nét), hình dáng (thẳng hay
nghiêng), kích cỡ phù hợp và có thể phân biệt sự khác nhau.
+ Có ba loại phông chữ : font Bitmap, font PotScript và font True Type. Mỗi
loại có hai phiên bản : font màn hình(screen font) và máy in (printer font)
- Chân chữ hay đường nền (baseline): đường thẳng mà mọi ký tự trong một
chuỗi cùng nằm trên đó.
- Thân chữ (ascent): Chiều cao từ chân chữ lên đến đầu chữ
- Đuôi chữ (descent): Khoảng cách lớn nhất từ chân chữ trở xuống của các
ký tự. Các chữ thường như g hay y thường có phần đuôi chiếm chiều cao
này.
- Khoảng hở (leading): Khoảng phân cách giữa hai chuỗi với nhau.
2. Vẽ chữ
2.1. Các thư viện phục vụ cho vẽ chữ có trong java
+ java.awt.Font : Gồm các phông chữ có sẵn trong hợ thống
+java.awt.font.TextLayout -> cho phép tạo kiểu chữ từ sự kết hợp các
chuỗi, phông chữ và đặt các thuộc tính . Sauk hi tạo ra đối tượng TextLayout
không thể chỉnh sửa, nhưng nó có phương thức để bạn có thể truy cập để bố
trí phông chữ, dấu nháy , kiểm tra thong tin
+java.awt.font.FontRenderContext : gồm các thông tin để đo và xác định vị
trí văn bản khi nó được tạo ra.
+java.awt.LineBreakMeasurer
2.2. Chương trình vẽ chữ

-Phương thức drawstring
Public void drawstring(String str, int x, int y)
Str: là một chuỗi ta cần ghi ra
x,y: tọa độ để ghi, vị trí x,y được lấy theo đường chân chữ
+Chuỗi có thể suất phát từ đối tượng String hoặc tập một dãy các kí tự bằng
một dãy các ký tự bằng hai phương thức sau:
//Ghi ra một dãy các ký tự tại vị trí x, y bắt đầu từ ký tự offs trong dãy
public void drawChars(char charArray[], int offs, int numChars int x,
int y)
//Ghi một dãy các byte tại vị trí x,y bắt đầu từ kí tự offs trong dãy
public void drawChars(byte byteArray[], int offs, int numChars int x,
int y)
+ Cách 1:
import java.awt.*;
import java.applet.*;
import javax.swing.*;
public class vd3 extends java.applet.Applet
{
public void paint(Graphics g)
{
super.paintComponents(g);
//chuỗi kí tự
g.drawString("welcome to Java",40,40);
}
public static void main(String[] args)
{
JFrame frame = new JFrame("DrawMessage");
frame.getContentPane().add(new vd3());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);

frame.setVisible(true);
}
+Cách 2:
import java.awt.*;
import java.applet.*;
import javax.swing.*;
public class thu extends java.applet.Applet
{
//tập các byte biểu diễn giá trị ASCII của kí tự
byte[] bytesToDraw={65,66,67,68,69,70,71}; // “ABCDEFG”
//
public static void main(String[] args)
{
JFrame frame = new JFrame("DrawMessage");
frame.getContentPane().add(new thu());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setVisible(true);
}
//
public void paint(Graphics g)
{
g.drawBytes(bytesToDraw, 0, bytesToDraw.length,
10,50);

}
}
+Cách 3:
import java.awt.*;
import java.applet.*;

import javax.swing.*;
public class thu extends java.applet.Applet
{
Char [] charsToDraw={‘A’,’B’,’C’,’D’,’E’,’F’,’G’};
//
public static void main(String[] args)
{
JFrame frame = new JFrame("DrawMessage");
frame.getContentPane().add(new thu());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setVisible(true);
}
//
public void paint(Graphics g)
{
g.drawBytes(charsToDraw, 0, charsToDraw.length, 10,20);

}
}
III. Vẽ hình 2D trong Java.
Java 2D không phải là API mới, nhưng bạn có thể sử dụng nó như là
công nghệ Java để tạo ra những hình ảnh chất lượng cao stunningly. Java 2D
API sẽ sử dụng. Nó có những khả năng như xử lý ảnh, alpha-based
compositing, antialiasing, biến đổi hình học, international text rendering, và
thậm chí là các thao tác in cao cấp.
Để hiểu những điều cơ bản về Java 2D, trước tiên bạn phải hiểu khái
niệm hiển thị. Hiển thị là quá trình mà máy đồ họa Java 2D (chính là lớp
java.awt.Graphics2D) nhận các lớp đồ họa như là hình, văn bản, ảnh rồi vẽ
chúng lên thiết bị xuất như là màn hình hay máy in. Sức mạnh của thư viện

Java 2D nằm ở khả năng hiển thị linh hoạt của lớp Graphics2D. Ở đây ta tìm
hiểu một số điều cơ bản của Java 2D bao gồm đường thẳng, hình, ….
1. Không gian người dùng và không gian thiết bị:
Chúng ta hãy bắt đầu bằng việc chỉ ra sự khác nhau giữa không gian
người dùng và không gian thiết bị. Trong hầu hết môi trường đồ họa máy
tính, mỗi pixel được đánh 1 số. Nếu bạn vẽ 1 hình vuông bắt đầu ở điểm (20,
20) thì góc trên trái của hình vuông sẽ bắt đầu ở pixel thứ 20 từ trục trái của
không gian vẽ và ở pixel thứ 20 từ trục trên của không gian vẽ. Tọa độ lấy
cách đều từ 2 trục được gọi là tọa độ Đề-Các. Vị trí của những đối tượng
Java 2D cũng được chỉ định.bằng.tọa,độ.này.
Tuy nhiên, Java 2D định nghĩa tọa độ theo đơn vị (72 đơn vị bằng 1 inch),
và việc hiển thị diễn ra trong mặt phẳng hypothetical được gọi là không gian
người dùng
Ví dụ: 1 hình rộng 4 inch trên màn hình (máy vi tính) thì cũng rộng
như vậy khi nó được in ra giấy. Màn hình (máy tính) thường có kích thước
72 pixel là 1 inch, vì vậy 1 đơn vị của Java 2D tương đương với 1 pixel. Tuy
nhiên, 1 máy in có thể có kích thước là 300, 600, hoặc thậm chí 1200 hoặc
nhiều hơn 1200 chấm là 1 inch. Trong trường hợp này máy đồ họa Java 2D
có nhiệm vụ chuyển từ không gian người dùng sang không gian thiết bị.
2. Đồ họa với Graphics2D
• Lớp Graphics cung cấp các methods đồ họa nhưng không xây dựng
các lớp ảnh.
• Lớp Graphics2D kế thừa lớp Graphics nhưng có xây dựng các lớp mô
tả ảnh và các phép biến hình …, có sử dụng hệ tọa độ thực

• Trong gói geom (geometry- hình học) có interface Shape và hiện thực
của các lớp Polygon, RectangularShape, Rectangle, Line2D,
CubicCurve2D, Area, GeneralPath, QuadCurve2D



Có lớp …Double, …Float cho phép mô tả hình trong hệ tọa độ thực.

Lớp AffineTransform mô tả cho các phép biến hình phẳng

3. Hệ toạ độ.
Màn hình ta hiện thấy được mô phỏng như một hệ toạ độ phẳng
Descartes gồm các điểm (x, y). Trục tung của hệ toạ độ này hướng xuống,
góc trái trên cùng của màn hình được tính là (0, 0). Toạ độ các điểm tăng
dần từ trái qua phải và từ trên xuống dưới. Toạ độ lớn nhất có thể được nằm
ở góc tận bên phải của màn hình và tuỳ thuộc vào độ phân giải của màn hình
mà có thể mang các giá trị khác nhau, chẳng hạn với màn hình có độ phân
giải 640x480 thì toạ độ này là (648,480) còn với độ phân giải 800x600 thì sẽ
là (800,600).
4. Kẻ đường thẳng.
Phương thức cơ bản nhất của đối tượng đồ hoạ Graphics dùng để vẽ
một đường thẳng thật đơn giản.
Public void drawLine (int x1, int y1, int x2, int y2)
Ta dùng phương thức này để vẽ một đường thẳng được tạo ra từ hai
điểm trên hệ toạ độ màn hình là (x1,y1) và (x2,y2). Dưới đây là kết quả của
chương trình vẽ đường thẳng
DrawLines.java Chương trình vẽ đường thẳng
import java.applet.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Duongthang extends Applet
{
public static void main(String[] args)
{
JFrame frame = new JFrame("DrawMessage");

frame.getContentPane().add(new Duongthang());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setVisible(true);
}
public void paint (Graphics g)
{
g.drawLine(0,0,200,100);
g.drawLine(20,120,250,120);
}
}
5. Vẽ hình chữ nhật 2D:
Vẽ một hình chữ nhật (hay hình vuông) đòi hỏi ta phải biết toạ độ
(x,y) góc trái trên của hình chữ nhật cùng có chiều rộng width và chiều cao
height của nó. Những phương thức sau sẽ giúp ta vẽ hình chữ nhật với các
dạng khác nhau:
Public void drawRect(int x, int y, int width, int height)
Phương thức này vẽ một hình chữ nhật với toạ độ đỉnh góc trái (x,y)
với chiều rộng width, chiều cao height. Ví dụ để vẽ hình chữ nhật ở toạ độ
(10,20) rộng 200 pixel cao 150 pixel ta thực hiện lệnh sau:
drawrect(10,20,200,150).
VD: chương trình vẽ hình chữ nhật
import java.applet.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Hinhchunhat extends Applet
{
public static void main(String[] args)
{

JFrame frame = new JFrame("DrawMessage");
frame.getContentPane().add(new Hinhchunhat());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setVisible(true);
}
public void paint(Graphics g)
{
g.drawRect(10,10,150,100);
}
}
IV. Vẽ hình 3D trong Java.
Hình ảnh được xuất hiện có chiều cao , chiều rộng và chiều sâu gọi là
3 chiều – 3D (three-dimensional) . Hình ảnh mà chỉ có chiều cao , chiều
rộng mà không có chiều sâu , gọi là 2 chiều – 2D (two-dimensional)
Một điều khác nhau giữa hình ảnh 2D và 3D ở chỗ , những hình ảnh
2D dùng cho những hình ảnh mang những thông tin đơn giản và nhanh
chóng , những hình 3D phức tạp hơn và chứa đựng nhiều thông tin hơn .
Nhìn những tam giác trên . Mỗi một tam giác có 03 cạnh và 03 góc .
Bên tay phải là hình chóp - cấu trúc 3D gồm 04 mặt là hình tam giác . Chú ý
rằng nó có 05 đường và 06 góc để cho biết đó là hình chóp - gần gấp hai lần
những thông tin yêu cầu của hình tam giác .
1. Vẽ hình chữ nhật 3 chiều (3D rectangle)
Lớp Graphics cung cấp cho ta cách vẽ hình chữ nhật 3 chiều (3D) tựa
như những nút nhấn (button) mà ta vẫn thường thấy. Cách vẽ hình chữ nhật
3D không khác gì cách vẽ hình chữ nhật bình thường chỉ có điều ta cần cho
biết thêm một đối số kiểu Boolean để xác nhận xem hình chữ nhật sẽ được
vẽ theo dạng 3D nào.
Có 2 cách vẽ , một sẽ làm cho đối tượng nổi lên(raised) hoặc hai sẽ
làm cho đối tượng có vẻ như chìm xuống

Sau đây là hai phương thức để vẽ hình chữ nhật 3D:
// Chỉ vẽ hình chữ nhật 3D không tô bên trong
Public void draw3DRect(int x, int y, int width, int height, Boolean
raised)
// Vẽ hình chữ nhật 3D và tô bên trong
Public void fill3DRect(int x, int y, int width, int height, Boolean
raised)
Nếu raised=true hình chữ nhật sẽ ở dạng nổi còn raised=false hình
chữ nhật sẽ ở dạng chìm.
Ví dụ: Chương trình vẽ hình chữ nhật 3 chiều
import java.awt.*;
import java.applet.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Component.*;
public class HCN_3D extends Applet
{
public static void main(String[] args)
{
JFrame frame = new JFrame("DrawMessage");
frame.getContentPane().add(new HCN_3D());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setVisible(true);
}
public void paint(Graphics g)
{
//Ðat mau trung voi mau nen
g.setColor(getBackground());
//Ve hinh chu nhat

g.draw3DRect(10,10,60,40,true);
//Ve hinh chu nhat chim ko duoc to ben trong
g.draw3DRect(100,10,60,40,false);
//Ve hinh chu nhat chim duoc to ben trong
g.fill3DRect(100,80,60,40,false);
}
}
2. Vẽ vòng tròn và hình ellip
Vòng tròn chỉ là trường hợp đặc biệt của hình Ellip, lớp Graphics của
java cung cấp cho ta phương thức drawOval và fillOval dùng để vẽ vừa
vòng tròn vừa ellip, hai hình này gọi chung là hình bầu dục (Oval). Cũng
như các hình trước fillOval dùng để tô đầy bên trong của hình.
//Vẽ một hình Oval
Public void drawOval(int x, int y, int width, int height)
//Tô một hình Oval
Public void fillOval(int x, int y, int width, int height)
Hình Oval mà ta vẽ nằm trọn trong một hình chữ nhật với kích thước
width và height. Không như các hàm đồ hoạ ta vẫn quen dùng, toạ độ (x,y)
của hai phương thức trên không phải là tâm của hình Oval mà là toạ độ đỉnh
góc trái trên cùng của hình chữ nhật. Trường hợp muốn vẽ vòng tròn hãy đặt
width=height.
Ví dụ: Chương trình vẽ vòng tròn và ellip
import java.awt.*;
import java.applet.*;
import javax.swing.*;
import java.awt.event.*;
public class btlon extends Panel
{
public static void main(String[] args)
{

JFrame frame = new JFrame("DrawMessage");
frame.getContentPane().add(new btlon());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setVisible(true);
}
public void paint(Graphics g)
{
//Vẽ hình tròn có đường kính là 60
g.drawOval(0,0,60,60);
//Vẽ hình elip rộng 40 và cao 20
g.fillOval(0,100,60,40);
}
}
B.CHƯƠNG TRÌNH VẼ MỘT SỐ HÌNH (HÌNH CHỮ
NHẬT, HÌNH TRÒN, HÌNH TRỤ, HÌNH LẬP
PHƯƠNG)
I. Chương trình:
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Component;
public class btlon extends JFrame implements ActionListener
{
//Chuong trinh chinh
public static void main(String arg[])
{
new btlon().setVisible(true);
}

//
private int x;
private int y;
protected boolean clear;
JMenuBar main=new JMenuBar();
JMenu mnufile=new JMenu("Ve hinh");
JMenuItem clears=new JMenuItem("Xoa ");
JMenuItem Rect=new JMenuItem("Hinh chu nhat 1");
JMenuItem Rectangle2=new JMenuItem("Hinh chu nhat 2");
JMenuItem Oval=new JMenuItem("Hinh tron");
JMenuItem filloval=new JMenuItem("Hinh tron 2");
JMenu mnucolor=new JMenu("Mau sac");
JMenuItem iRed=new JMenuItem("Do");
JMenuItem iYellow=new JMenuItem("Vang");
JMenuItem iGreen=new JMenuItem("Xanh la");
JMenuItem iBlue=new JMenuItem("Xanh da troi");
JMenuItem iGray=new JMenuItem("Xam");
JMenuItem iPink=new JMenuItem("Hong");
JMenuItem iOrange=new JMenuItem("Cam");
JMenuItem icyan=new JMenuItem("Luc lam");
JMenu mnuKhoi=new JMenu("3D");
JMenuItem iCylinder=new JMenuItem("Tru tron");
Color color;
private JTextField a, b, c,d; //KICH THUOC 1 VA 2
//private JButton jbtVe;
String hinh=new String();//STRING HINH=NEW STRING()
public void setx(int x)
{
this.x=x;
}

public int getx()
{
return this.x;
}
public void sety(int y) //XAC DINH DIEM DAT CUA CON
TRO CHUOT
{
this.y=y;
}
public int gety() //GET
{
return this.y;
}
public btlon() //HAM TAO
{
super("Chuong trinh demo cac cong cu Graphic cua Java");
//TITLE
Container tuyen=getContentPane();
tuyen.setLayout(new BorderLayout());
main.add(mnufile); //add MENU VAO
CONTAINER
main.add(mnucolor);
main.add(mnuKhoi);
mnufile.add(clears);
mnufile.add(Rect);
mnufile.add(Oval);
mnufile.add(Rectangle2);
mnufile.add(filloval);
mnucolor.add(iRed);
mnucolor.add(iYellow);

mnucolor.add(iBlue);
mnucolor.add(iGreen);
mnucolor.add(iGray);
mnucolor.add(iPink);
mnucolor.add(iOrange);
mnucolor.add(icyan);
mnuKhoi.add(iCylinder);
setJMenuBar(main);
//p1 chua nhan va file van ban
JPanel p1 = new JPanel(new FlowLayout());
p1.add(new JLabel("Gia tri 1 :"));
p1.add(a = new JTextField(3));
p1.add(new JLabel("Gia tri 2 :"));
p1.add(b = new JTextField(3));
p1.add(new JLabel("Gia tri 3 :"));
p1.add(c = new JTextField(3));
p1.add(new JLabel("Gia tri 4 :"));
p1.add(d = new JTextField(3));
//Them p1 vao frame
getContentPane().setLayout(new BorderLayout());
getContentPane().add(p1, BorderLayout.CENTER);
iRed.addActionListener(this);
iYellow.addActionListener(this);
iBlue.addActionListener(this);
iGreen.addActionListener(this);
iGray.addActionListener(this);
iPink.addActionListener(this);
iOrange.addActionListener(this);
icyan.addActionListener(this);
iCylinder.addActionListener(this);

Rect.addActionListener(this);
Rectangle2.addActionListener(this);
Oval.addActionListener(this);
filloval.addActionListener(this);
clears.addActionListener(this);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
setVisible(false);
dispose();
System.exit(0);
}
});
addMouseListener(new MouseHanlder(this));
setSize(500,500);
}
//XU LY su kien
public void actionPerformed(ActionEvent ev)
{
String actionCommand = ev.getActionCommand();
if (ev.getSource()==iRed)
this.color=Color.red;
if (ev.getSource()==iYellow)
this.color=Color.yellow;
if (ev.getSource()==iBlue)
this.color=Color.blue;
if (ev.getSource()==iGreen)
this.color=Color.green;
if (ev.getSource()==iGray)

this.color=Color.gray;
if (ev.getSource()==iPink)
this.color=Color.pink;
if (ev.getSource()==iOrange)
this.color=Color.orange;
if (ev.getSource()==icyan)
this.color=Color.cyan;
if (ev.getSource()==clears)
{
this.clear=true;
this.repaint();
this.hinh="";
}
if (ev.getSource()==Rect)
{
this.clear=false;
this.hinh="rect";
this.repaint();
}
if (ev.getSource()==Rectangle2)
{
this.clear=false;
this.hinh="tri";
this.repaint();
}
if (ev.getSource()==Oval)
{
this.clear=false;
this.hinh="oval";
this.repaint();

}
if (ev.getSource()==filloval)
{
this.clear=false;
this.hinh="foval";
this.repaint();
}
if (ev.getSource()==iCylinder)
{
this.clear=false;
this.hinh="Cylinder";
this.repaint();
}
}
public void update(Graphics g)
{
paint(g);
}
public void paint(Graphics g)
{
if (this.clear !=true && this.hinh.equals("rect"))
{

int num1 = (Integer.parseInt(a.getText().trim()));
int num2 = (Integer.parseInt(b.getText().trim()));
g.setColor(this.color);
g.drawRect(this.getx(),this.gety(),num1, num2);
}
if (this.clear !=true && this.hinh.equals("oval"))
{

int num1 = (Integer.parseInt(a.getText().trim()));
g.setColor(this.color);
g.drawOval(this.getx(),this.gety(),num1,num1);
}
if (this.clear !=true && this.hinh.equals("tri"))
{
int num1 = (Integer.parseInt(a.getText().trim()));
int num2 = (Integer.parseInt(b.getText().trim()));
g.setColor(this.color);
g.fillRect(this.getx(),this.gety(),num1,num2);
}
if (this.clear !=true && this.hinh.equals("foval"))
{
int num1 = (Integer.parseInt(a.getText().trim()));
g.setColor(this.color);
g.fillOval(this.getx(),this.gety(),num1,num1);
}
if (this.clear !=true && this.hinh.equals("Cylinder"))
{
int num1 = (Integer.parseInt(a.getText().trim()));
int num2 = (Integer.parseInt(b.getText().trim()));
int num3 = (Integer.parseInt(c.getText().trim()));
g.setColor(this.color);
g.drawOval(this.getx(), this.gety(),num1,num2);
g.drawLine(this.getx(), this.gety()+num2/2, this.getx(),
this.gety()+num2/2+num3 );
g.drawLine(this.getx()+num1, this.gety()+num2/2,
this.getx()+num1, this.gety()+num2/2+num3 );
g.drawOval(this.getx(), this.gety()+num3,num1,num2);
}

if (this.hinh.equals(""))
{
g.setColor(getBackground());
g.fillRect(this.getx(),this.gety(),300,300);
}
}
}
//CLASS MOUSEHANDLER
class MouseHanlder extends MouseAdapter
{
private btlon draw;
public MouseHanlder(btlon d)
{
draw=d;
}
//TOA DO CHUOT
public void mousePressed(MouseEvent e)
{
draw.setx(e.getX());
draw.sety(e.getY());
}
public void mouseReleased(MouseEvent e)
{
draw.repaint();
}
}
II. Hướng dẫn sử dụng
 Chương trình có 3 menu là:
1. Vẽ hình: cho phép người sử dụng lựa chọn để vẽ các hình:
a. Xóa

b. Hình chữ nhật1 (chỉ có viền khung)
c. Hình tròn1 (Chỉ có đường viền)
d. Hình chữ nhật2 (được tô bên trong)
e. Hình tròn 2 (được tô bên trong)
2. Màu: cho phép người dùng chọn một trong các màu sau để vẽ:
a. Đỏ
b. Vàng
c. Xanh nước biển
d. Xanh lá cây
e. Hồng
f. Màu xám
g. Màu lục lam
h. Cam
3. 3D: có hai tính năng sau:
a. Vẽ hình trụ tròn
b. Vẽ hình lập phương
 Cách sử dụng:
1. Vẽ hình chữ nhật:
Để vẽ được hình chữ nhật bạn phải nhập hai chỉ số vào 2 ô: giá
trị 1 và giá trị 2 là kích thước chiều dài và chiều rộng của hình
chữ nhật.
2. Vẽ hình tròn:
Bạn phải nhập đường kính của hình tròn vào ô giá trị 1 để vẽ
hình tròn.
3. Vẽ hình tam giác:
Bạn phải nhập 4 giá trị vào 4 ô: giá trị 1, giá trị 2, giá trị 3, giá
trị 4 lần lượt là tọa độ x,y cúa 2 đỉnh của tam giác mà bạn muốn
vẽ. (Đỉnh thứ ba là tọa độ vị trí mà con trỏ chuột kích xuống)
4. Xóa
Khi bạn muốn xóa 1 hình nào đó bạn chọn chức năng xóa và

kích chuột vào hình mà bạn muốn xóa.
5. Sử dụng màu
Bạn chọn màu để vẽ các hình trên menu Màu .
6. Vẽ hình trụ
Bạn nhập vào các ô giá trị 1, giá trị 2, giá trị 3 vẽ hình trụ.
7. Vẽ hình lập phương

×