3. Tạo cửa sổ khung (frame)
• Sử dụng lớp JFrame
JFrame frame = new JFrame();
frame.setSize(300, 400);
frame.setTitle("An Empty Frame");
frame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
• import javax.swing.*;
• Ví dụ :
•EmptyFrameViewer.java
(BigJava, ch05)
2009-2010 OOP - http://mim.hus.edu.vn/elearning 3
4. Vẽ hình (1)
paintComponent: là phương thức được gọi mỗi
khi cần vẽ lại một thành phần đồ hoạ
VD: thành phần hình chữ nhật được xây dựng nhờ
thừa kế (từ khoá extends) lớp JComponent
public class RectangleComponent extends JComponent {
public void paintComponent(Graphics g){
// Recover Graphics2D
Graphics2D g2 = (Graphics2D) g;
...
}
}
2009-2010 OOP - http://mim.hus.edu.vn/elearning 4
5. Vẽ hình (2)
Lớp Graphics: cho phép thao tác với các trạng thái đồ
họa (vd: màu hiện tại)
Lớp Graphics2D: có các phương thức để vẽ hình khối.
Phải ép kiểu để thu được đối tượng g2 thuộc lớp
Graphics2D từ tham biến g thuộc lớp Graphics
Vẽ hình:
Rectangle box = new Rectangle(5, 10, 20, 30);
g2.draw(box);
Các lớp đồ hoạ thuộc gói java.awt
2009-2010 OOP - http://mim.hus.edu.vn/elearning 5
6. VD: vẽ hình chữ nhật
Xây dựng 2 lớp:
RectangleComponent có phương thức paintComponent để vẽ
2 hình chữ nhật
RectangleViewer có hàm main làm các việc sau:
Vẽ một khung
Xây dựng một đối tượng thuộc lớp thành phần hình chữ nhật:
RectangleComponent component = new
RectangleComponent();
Thêm thành phần vào khung:
frame.add(component);
/* trước version 5 cần dùng lệnh
frame.getContentPane().add(component); */
Hiển thị khung (setVisible)
RectangleComponent.java, RectangleViewer.java (BigJava ch05)
2009-2010 OOP - http://mim.hus.edu.vn/elearning 6
7. Ứng dụng con (Applet)
Applets là các chương trình chạy trong một trình duyệt Web
Để cài đặt một applet, sử dụng đoạn mã kiểu như sau (tương tự như vẽ thành
phần đồ hoạ, ngoại trừ vài thay đổi):
public class MyApplet extends JApplet // thay cho JComponent
{
public void paint(Graphics g) // thay cho paintComponent
{
// Recover Graphics2D
Graphics2D g2 = (Graphics2D) g;
// Drawing instructions go here
. . .
}
}
Để chạy một applet, cần một tệp HTML có thẻ applet
Một tệp HTML có thể có nhiều applets; mỗi applet có một thẻ
Sử dụng một appletviewer hoặc một trình duyệt có hỗ trợ Java để chạy applet
2009-2010 OOP - http://mim.hus.edu.vn/elearning 7
9. Các hình đồ họa (1)
Rectangle, Ellipse2D.Double,
Line2D.Double: mô tả các hình
Các lớp .Double này là các lớp trong (inner class),
cách sử dụng không khác các lớp thông thường, tuy
nhiên khi khai báo thư viện thì khai báo lớp ngoài của
chúng:
import java.awt.geom.Ellipse2D;
// không có .Double
Vẽ hình: Tạo đối tượng hình rồi thực hiện lệnh vẽ
2009-2010 OOP - http://mim.hus.edu.vn/elearning 9
10. Các hình đồ họa (2)
Vẽ hình elíp:
Ellipse2D.Double ellipse = new Ellipse2D.Double(x, y, width, height);
g2.draw(ellipse);
Vẽ đường thẳng:
Line2D.Double segment = new Line2D.Double(x1, y1, x2, y2);
hoặc
Point2D.Double from = new Point2D.Double(x1, y1);
Point2D.Double to = new Point2D.Double(x2, y2);
Line2D.Double segment = new Line2D.Double(from, to);
g2.draw(segment);
Vẽ một xâu:
g2.drawString("Message", 50, 100);
2009-2010 OOP - http://mim.hus.edu.vn/elearning 10
11. Các hình đồ họa (3)
Elíp
2009-2010 OOP - http://mim.hus.edu.vn/elearning 11
12. Màu sắc
Các màu chuẩn: Color.BLUE, Color.RED,
Color.PINK, v.v…
Pha màu RGB (red, green, blue) với các giá trị trong
khoảng 0.0F và 1.0F (F = float)
Color magenta = new Color(1.0F, 0.0F, 1.0F);
Thiết lập màu đồ hoạ:
g2.setColor(magenta);
Màu đã thiết lập được dùng để vẽ và tô màu các hình
g2.fill(rectangle); // tô với màu hiện tại của g2
2009-2010 OOP - http://mim.hus.edu.vn/elearning 12
13. Đọc dữ liệu văn bản
1 ứng dụng đồ hoạ có thể lấy dữ liệu vào bằng cách hiển
thị hộp thoại với lớp JOptionPane
Phương thức showInputDialog
dùng để hiển thị một lời nhắc và đợi người dùng nhập dữ liệu
kết quả trả về là một xâu mà người dùng đã nhập
Ví dụ
String input = JOptionPane.showInputDialog("Enter x");
double x = Double.parseDouble(input);
VD chương trình (BigJava, ch05)
ColorViewer.java, ColoredSquareComponent.java
2009-2010 OOP - http://mim.hus.edu.vn/elearning 13
14. Vẽ hình phức tạp (1)
VD:
Vẽ 2 xe ô tô: 1 ở góc trên bên trái của màn hình, 1 ở góc dưới bên phải
Lời khuyên:
Tạo 1 lớp riêng cho mỗi hình
class Car
{
. . .
public void draw(Graphics2D g2)
{
// Drawing instructions
. . .
}
}
Vẽ nháp trên giấy khi cần vẽ các hình phức tạp
2009-2010 OOP - http://mim.hus.edu.vn/elearning 14
16. Vẽ hình phức tạp (3)
Cụ thể:
Tính vị trí góc dưới bên phải màn hình trong phương thức
paintComponent
int x = getWidth() - 60;
int y = getHeight() - 30;
Car car2 = new Car(x, y);
getWidth và getHeight áp dụng trên đối tượng thực hiện
phương thức paintComponent
Nếu cửa sổ khung thay đổi kích thước, phương thức
paintComponent sẽ được gọi và vị trí của xe được tính lại
Chương trình (BigJava, ch05):
CarComponent.java
Car.java
CarViewer.java
2009-2010 OOP - http://mim.hus.edu.vn/elearning 16
17. So sánh thông tin dạng số và
trực quan
Tính giao điểm giữa đường tròn và đường thẳng
Đường tròn có bán kính r = 100 và tâm (a, b) = (100, 100)
Đường thẳng có giá trị tham số x
Tính giao điểm:
Phương trình đường tròn với bán kính r và tâm (a, b) là
(x – a)2 + (y – b)2 = r2
Biết x, tính được giá trị của y với lệnh Java:
double root = Math.sqrt(r * r - (x - a) * (x - a));
double y1 = b + root;
double y2 = b - root;
Kết quả trực quan trên hình vẽ và kết quả số thu được phải
giống nhau
2009-2010 OOP - http://mim.hus.edu.vn/elearning 17
18. Giao điểm của đường thẳng và
đường tròn
Chương trình:
IntersectionComponent.java
IntersectionViewer.java
LabeledPoint.java
2009-2010 OOP - http://mim.hus.edu.vn/elearning 18