5.1.6. Điều khiển màu
Trong Java, chúng ta điều khiển màu bằng cách dùng 3 màu chính là đỏ (red), xanh lá cây (green), xanh dương (blue). Java sử dụng mô hình màu RGB. Đối tượng của lớp Color chứa 3 số nguyên cho các tham số red, green, blue. Bảng sau trình bày giá trị có thể có của các màu đó:
Phạmvi | |
Red | 0-255 |
Green | 0-255 |
Blue | 0-255 |
Có thể bạn quan tâm!
- Lập trình Java - 23
- Các Phương Thức Của Một Applet
- Lập trình Java - 25
- Lập trình Java - 27
- Lập trình Java - 28
- Lập trình Java - 29
Xem toàn bộ 267 trang tài liệu này.
Bảng 5.2. Phạm vi giá trị của các thành phần màu
Sử dụng các giá trị trên để tạo ra một màu tuỳ thích. Cú pháp của hàm dựng để tạo ra một màu như sau:
color (int red, int green, int blue);
Bảng sau hiển thị các giá trị của các màu thường gặp:
Red | Green | Blue | |
White | 255 | 255 | 255 |
Light Gray | 192 | 192 | 192 |
Gray | 128 | 128 | 128 |
Dark Gray | 64 | 64 | 64 |
Black | 0 | 0 | 0 |
Pink | 255 | 175 | 175 |
Orange | 255 | 200 | 0 |
Yellow | 255 | 255 | 0 |
Magenta | 255 | 0 | 255 |
Bảng 5.3. Các giá trị RGB
Các đối tượng màu khác nhau có thể được tạo bằng những giá trị này. Những đối này có thể được dùng để vẽ hoặc tô các đối tượng đồ hoạ. Ví dụ, để tạo màu hồng, ta dùng lệnh sau:
color c = new Color (255, 175, 175);
Ta có thể thiết lập màu bằng cách dùng lệnh sau:
g.setColor (c); //g là đối tượng của lớp Graphics
Sử dụng kết hợp các giá trị RGB để tạo ra một màu tuỳ ý. Để cho dễ hơn, lớp Color cung cấp sẵn một số màu.
color.black | |
color.orange | color.gray |
color.lightgray | color.darkgray |
color.red | color.green |
color.blue | color.pink |
color.cyan | color.magenta |
color.yellow |
Bảng 5.4. Các màu thường gặp
Đoạn mã sau minh hoạ cách tạo một màu tuỳ ý:
Color color1 = new Color (230, 140, 60);
Color color4 = new Color (90, 210, 130); g.setColor (color1);
int myred = color1.getRed ();
int mygreen = color1.getGreen (); int myblue = color1.getBlue(); color1 = color1.darker();
color4 = color4.brighter();
5.1.7. Điều khiển Font
Java cung cấp lớp Font trong gói java.awt cho phép sử dụng các loại font khác nhau. Lớp này bao gồm một số phương thức.
Để sử dụng font, chúng ta nên kiểm tra xem hệ thống có hỗ trợ hay không.
Phương thức „getAllFont()‟ trả về tất cả các font mà hệ thống hỗ trợ.
Trước tiên, khai báo một đối tượng của lớp GraphicsEnvironment như sau:
GraphicsEnvironment ge;
ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
Đối tượng này sử dụng cú pháp sau để lấy tất cả các font có trong mảng Font:
Font f[] = ge.getAllFonts();
Phương thức getAllFont() được sử dụng ở đây. Phương thức getAllFonts() thuộc lớp GraphicsEnvironment. Đây là lớp trừu tượng, do đó ta không thể khởi tạo lớp này. để truy cập phương thức getAllFont(), chúng ta sử dụng phương thức
„getLoacalGraphicsEnvironment()‟ của lớp GraphicsEnvironment.
ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
Tham chiếu đến lớp này được gán cho biến ge. Biến này gọi phương thức getAllFont(). Chúng ta sử dụng các font khác nhau để hiển thị các chuỗi khác nhau. Phương thức getFont() trả về font mặc định dùng để hiển thị chuỗi, khi không có chọn font nào cả.
Font defaultFont = g.getFont (); //g là đối tượng Graphics g.drawString (“Default Font is ”, 30, 50);
Dialog là font mặc định của hệ thống.
Để thay đổi font mặc định của hệ thống thành font khác, chúng ta tạo đối tượng của lớp Font. Phương thức khởi tạo của Font có 3 tham số sau:
Tên của font. Ta có thể lấy tên thông qua phương thức getFontList().
Kiểu của font. Ví dụ: Font.BOLD, Font.PLAIN, Font.ITALIC.
Kích thước font.
Cú pháp sau minh hoạ những thông số trên:
Font f1 = new Font (“SansSerif”, Font.ITALIC, 16); g.setFont (f1);
Ba tham số được truyền ở đây là: „SanSerif‟ – tên của font, Font.BOLD – kiểu font, 14 là kích thước của font. Những thông số này tạo ra đối tượng f1. Chúng ta có thể kết hợp 2 kiểu font lại với nhau. Hãy xét ví dụ sau:
Font f3 = new Font (“Monospaced”, Font.ITALIC+Font.BOLD, 20); Ở đây kiểu font của f3 vừa đậm, vừa nghiêng.
5.1.8. Lớp FontMetrics
Lớp này xác định kích thước của các ký tự khác nhau thuộc các loại font khác nhau. Xác định kích thước bao gồm chiều cao (height), baseline, descent, và leading. Điều này rất cần thiết vì các ký tự khi in đều chiếm một kích thước riêng. Bạn cần tính kích thước cần thiết khi in các ký tự để tránh các ký tự đè lên nhau.
Height: chiều cao của font.
Baseline (Dòng cơ sở): xác định cơ sở của các ký tự (không kể phần thấp nhất của ký tự)
Ascent: khoảng cách từ đường baseline đến đỉnh của ký tự.
Descent: khoảng các từ baseline đề đáy của ký tự.
Leading: khoảng cách giữa các chữ.
Ví dụ 5.6 sau minh hoạ việc sử dụng các phương thức khác nhau mà lớp FontMetrics có. Trong chương trình này, chúng ta sử dụng các phương thức khác nhau để xem xét chi tiết các loại font khác nhau. Lớp FontMetric là lớp trừu tượng. Phương thức getFontMetrics() có tham số là đối tượng của lớp Font, vì FontMetrics đi đôi với một font nào đó.
FontMetrics fm = g.getFontMetrics (f1);
Lệnh này tạo đối tượng fm của lớp FontMetrics, cùng với đối tượng f1. Bây giờ, chúng ta sử dụng fm để lấy chi tiết của font.
Các phương thức getHeight, getAscent(), getDescent(), và getLeading() trả về chi tiết của font. Phương thức getFont() của lớp FontMetrics trả về Font mà gắn với đối tượng lớp FontMetrics. Phương thức getName() của lớp Font trả về tên Font.
Ví dụ 5.6: Sử dụng các phương thức khác nhau mà lớp FontMetrics
import java.awt.*;
class FontMetricsUse extends Frame
{
public FontMetricsUse()
{
super ("Detail of Fonts"); setSize (400, 300); setVisible(true);
}
public void paint (Graphics g)
{
Font f1 = new Font ("Times Roman", Font.PLAIN, 22); FontMetrics fm = g.getFontMetrics (f1);
String name = fm.getFont().getName(); g.drawString ("Details of Font " + name, 30, 50);
125);
150);
250);
275);
}
g.drawString ("Height: " + String.valueOf (fm.getHeight()), 50, 75); g.drawString ("Ascent: " + String.valueOf (fm.getAscent()), 50, 100); g.drawString ("Descent: " + String.valueOf (fm.getDescent()), 50,
g.drawString ("Leading: " + String.valueOf (fm.getLeading()), 50,
Font f2 = new Font ("DialogInput", Font.PLAIN, 22); fm = g.getFontMetrics (f2);
name = fm.getFont().getName();
g.drawString ("Details of Font " + name, 30, 175);
g.drawString ("Height: " + String.valueOf (fm.getHeight()), 50, 200); g.drawString ("Ascent: " + String.valueOf (fm.getAscent()), 50, 225); g.drawString ("Descent: " + String.valueOf (fm.getDescent()), 50,
g.drawString ("Leading: " + String.valueOf (fm.getLeading()), 50,
public static void main (String args[])
{
new FontMetricsUse ();
}
}
Kết quả của chương trình trên:
Hình 5.7. Kết quả chạy ví dụ 5.6
Ví dụ 5.7 minh hoạ cách lớp FontMetrics được sử dụng để in đoạn văn bản nhiều font, nhiều dòng. Trong chương trình này, chúng ta cần in văn bản nhiều font trên nhiều dòng. Lớp FontMetrics giúp ta xác định khoảng cách cần thiết để in một dòng văn bản cho một font nào đó. Điều này thật cần thiết, bởi vì dòng thứ 2 được in ngay sau dòng thứ nhất.
Trước tiên chúng ta in msg1 sử dụng font Monospaced. Sau đó, chúng ta in msg2 sử dụng font DiaglogInput. Để làm được điều này, chúng ta cần tính khoảng cách cần thiết để in msg1. Phương thức stringWidth() của lớp FontMetrics được dùng để tính ra tổng khoảng cách cần thiết để in msg1. Khi chúng cộng thêm khoảng cách này vào biến x, chúng ta sẽ lấy được vị trí mà chúng ta bắt đầu in đoạn văn bản kế tiếp, msg2. Phương thức setFont() được dùng để thiết lập font để in văn bản.
Kế đó, chúng ta in msg1 và msg2 trên các dòng khác nhau sử dụng chung 1 font Monospaced. Ở đây, chúng ta cần biết khoảng cách chiều cao của font, để in dòng kế tiếp. Phương thức getHeight() được dùng để làm điều này.
Ví dụ 5.7: Minh hoạ cách lớp FontMetrics được sử dụng để in đoạn văn bản nhiều font, nhiều dòng.
import java.awt.*;
class MultiFontMultiLine extends Frame
{
public MultiFontMultiLine()
{
super ("Multiline Text"); setSize (450, 200); setVisible (true);
}
public void paint (Graphics g)
{
Font f1 = new Font ("MonoSpaced", Font.BOLD, 18); Font f2 = new Font ("DialogInput", Font.PLAIN, 14); int x = 20;
int y = 50;
String msg1 = "Java Language";
String msg2 = "A new approach to programming"; FontMetrics fm = g.getFontMetrics(f1); g.setFont(f1);
g.drawString (msg1, x, y);
x = x + fm.stringWidth(msg1); g.setFont(f2);
g.drawString (msg2, x, y); g.setFont(f1);
y = 100;
x = 20;
int height = fm.getHeight(); g.drawString (msg1, x, y); y += height;
g.drawString (msg2, x, y);
}
public static void main (String args[])
{
new MultiFontMultiLine ();
}
}
Kết quả của chương trình trên:
Hình 5.8. Kết quả chạy ví dụ 5.7
5.1.9. Chọn chế độ để vẽ
Các đối tượng được vẽ bằng cách sử dụng mode vẽ. Khi một đối tượng mới được vẽ, nó sẽ đè lên các hình đã vẽ trước đây. Tương tự, khi các đối tượng được vẽ đi vẽ
lại nhiều lần thì chúng sẽ xoá các đối tượng đã vẽ trước đó. Chỉ hiển thị nội dung của đối tượng mới. Để làm cho nội dung của và nội dung mới đều hiển thị trên cùng nền, lớp Graphics cung cấp phương thức setXORMode (Color c);
Ví dụ5.8: minh hoạ tiện lợi của việc sử dụng phương thức setXORMode(). Ở đây, chúng ta sử dụng phương thức setXORMode() để tô các hình đồ hoạ khác nhau, mà không đè lên các hình khác. Kết quả là, khi sử dụng mode XOR thì hiển nhiên là tất cả các hình đều hiển thị đầy đủ. Điều này có nghĩa là các hình mới không đè lên các hình cũ. Thay vào đó, phần chung giữa các hình sẽ được hiển thị thành một màu khác. Nhưng khi không sử dụng mode XOR, hình mới hoàn toàn che khuất những hình trước đó.
import java.awt.*;
class PaintMode extends Frame
{
public PaintMode()
{
super ("Paint Mode"); setSize (300, 300); setVisible (true);
}
public void paint (Graphics g)
{
g.setPaintMode (); g.setColor (Color.blue); g.fillRect (50,50,40, 30); g.setColor (Color.pink); g.fillOval (70, 65, 30, 60); g.setColor (Color.cyan);
g.fillRoundRect (90, 80, 70, 50, 20, 30); g.setColor (Color.blue);
g.fillRect (50, 150, 40, 30); g.setXORMode (Color.yellow); g.fillOval (70, 165, 30, 60);