oop 4

18
Bài 4: Lập trình đồ họa Programming Graphics Giảng viên: Nguyễn Thị Minh Huyền [email protected] Đỗ Thanh Hà [email protected]

Upload: thai-hoc-vu

Post on 26-May-2015

1.017 views

Category:

Technology


0 download

DESCRIPTION

slide java o lop

TRANSCRIPT

Page 1: Oop 4

Bài 4: Lập trình đồ họaProgramming Graphics

Giảng viên: Nguyễn Thị Minh Huyề[email protected]

Đỗ Thanh Hà[email protected]

Page 2: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 2

Tài liệu tham khảo

BigJava – chương 5

Page 3: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 3

Tạo cửa sổ khung (frame)

• Sử dụng lớp JFrameJFrame 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)

Page 4: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 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 JComponentpublic class RectangleComponent extends JComponent {

public void paintComponent(Graphics g){// Recover Graphics2DGraphics2D g2 = (Graphics2D) g;...

}}

Page 5: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 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

Page 6: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 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)

Page 7: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 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 Graphics2DGraphics2D 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

Page 8: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 8

Applets – Ví dụ

Tệp ví dụ (BigJava, ch05): RectangleApplet.java, RectangleApplet.html, RectangleAppletExplained.html

Dùng appletviewer: appletviewer RectangleApplet.html

Page 9: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 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ẽ

Page 10: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 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);

Page 11: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 11

Các hình đồ họa (3)

Elíp

Page 12: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 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

Page 13: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 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

Page 14: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 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

Page 15: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 15

Vẽ hình phức tạp (2)

Page 16: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 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

Page 17: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 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

Page 18: Oop 4

2009-2010 OOP - http://mim.hus.edu.vn/elearning 18

Giao điểm của đường thẳng và đường tròn

Chương trình: IntersectionComponent.java IntersectionViewer.java LabeledPoint.java