Java: Cách sử dụng đường bao (Border)

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Mỗi JComponent có thể có một hoặc nhiều đường bao (border). Đường bao là đối tượng vô cùng hữu ích, trong khi bản thân nó không phải là thành phần thì làm thế nào để vẽ các đường bao cho cac thành phần Swing. Đường bao hữu ich không chỉ bởi việc vẽ các đường và cạnh lạ mắt, nó còn cung cấp các tiêu đề và không gian trống xung quanh các thành phần.


Lưu ý: Các ví dụ của chúng tôi sẽ thiết lập đường viền trên các JPanel, JLabel và các lớp con theo ý riêng của JComponent. Mặc dù về mặt kỹ thuật bạn có thể đặt đường viền lên mọi đối tượng thừa kế từ JComponent, nhưng diện mạo và hoạt động triển khai trên nhiều thành phần có thể không làm việc tốt. Nói chung, khi bạn muốn đặt đường viền lên thành phần Swing mà không phải là JPanel hoặc JLabel thì chúng tôi đề nghị bạn nên đặt thành phần bên trong JPanel và thiết lập đường viền lên JPanel.

Để thiết lập đường bao xung quanh một JComponent thì bạn sử dụng phương thức setBorder của thành phần đó. Bạn có thể sử dụng lớp BorderFactory để tạo hầu hết các loại đường bao cho các thành phần Swing. Nếu bạn cần tham chiếu tới một đường bao thì bạn có thể lưu nó vào một biến có kiểu Border. Dưới đây là một ví dụ về việc tạo một đường bao cho bộ chứa:

JPanel pane = new JPanel();
pane.setBorder(BorderFactory.createLineBorder(Color.black));

Ảnh dưới đây thể hiện kết quả của ví dụ trên:

A line border

Ví dụ BorderDemo

Ảnh sau đây thể hiện một ứng dụng gọi là BorderDemo hiển thị các loại đường viền.

BorderDemo: Simple Borders

Hình ảnh sau đây cho thấy một số đường viền lồng hình. Khi tạo đường viền lồng hình thì bạn cần xác định bao nhiêu điểm ảnh nó chiếm ở phần top, left, bottom và right. Sau đó bạn xác định hoặc màu hoặc biểu trưng (icon) cho đường viền lồng hình để vẽ. Bạn cần cẩn thận khi chọn biểu trưng và xác định kích thước của thành phần; mặt khác, biểu trưng có thể nhận được cắt nhuyễn ra hoặc có không khớp ở góc của thành phần.

BorderDemo: Matte Borders

Hình ảnh kế tiếp sau đây cho thấy tựa đề của đường viền. Sử dụng đường viền có tựa đề ta óc thể mô tả vắn tắt nội dung bên trong đường viền. Nếu bạn không xác định đường viền, thì đường viền look-and-feel-specific có thể được sử dụng. Chẳng hạn như, mặc định đặt đường viền có tựa đề trong Java look and feel sử dụng đường màu xám, và mặc định đặt đường viền có tựa đề trong Windows look and feel sử dụng đường viền khắc sâu. Theo mặc định thì tiêu đề sẽ nằm giữa phía trên trái của đường viền như được thể hiện ở phía trên của hình sau:

BorderDemo: Titled Borders

Hình tiếp theo thể hiện các đường viền hợp nhất. Với loại đường viền này thì ta có thể kết hợp hai đường viền bất kỳ để chúng gộp lại thành đường viền hợp nhất.

BorderDemo: Compound Borders

Sử dụng đường viền do Swing cung cấp

Toàn bộ code của ứng dụng thể hiện cách tạo và thiết lập đường viền mà bạn có thể thấy ở các hình trên bạn tham khảo tại phần ví dụ demo BorderDemo.

Bạn cần lưu ý là đoạn mã trên sử dụng lớp BorderFactory để tạo từng đường bao. Lớp BorderFactory thuộc gói javax.swing, trả về các đối tượng thực thi giao diện Border.

Giao diện Border cũng như việc triển khai các thành phần của Swing nằm trong gói javax.swing.border. Ta thường không cần trực tiếp sử dụng bất kỳ điều gì trong gói này ngoại trừ việc xác định các hằng cho nó.

Tạo đường viền tùy chỉnh

Nếu BorderFactory không cung cấp được loại đường viền mong muốn thì ta có thể cần trực tiếp sử dụng API trong gói đường viền hoặc định nghữa đường viên riêng. Mặt khác, để chứa giao diện Border thì gói đường viền có chứa các lớp để thực thi đường viên: LineBorderEtchedBorderBevelBorderEmptyBorderMatteBorderTitledBorder và CompoundBorder. Gói đường viên cũng chứa một lớp có tên SoftBevelBorder, lớp này hoạt động và cho kết quả tương tự như BevelBorder nhưng đường viền nó tạo ra thì mềm mại hơn.

Để tạo đường viền riêng thì ta tạo một lớp con của lớp AbstractBorder. Trong lớp con này ta thực thi ít nhất một hàm tạo, và thực hiện hai phương thức sau:

  • paintBorder, chứa mã lệnh vẽ mà JComponent sẽ dùng để vẽ đường viền.
  • getBorderInsets, xác định không gian mà đường viền cần để vẽ bản thân nó.

Nếu đường viền tùy chỉnh có dạng chữ nhật (và phổ biến là có dạng chữ nhật) thì ta cần ghi đề các phương thức AbstractBorder.getBorderInsets(Component c) và AbstractBorder.getBorderInsets(Component c,Insets insets) để có được dạng chữ nhật đúng.

For examples of implementing borders, see the source code for the classes in the javax.swing.border package.

API Border

Bảng sau đây liệt kê các phương thức phổ biến của border. API dùng cho border có thể là một trong hai loại sau:

  • Tạo đường bao với BorderFactory
  • Thiết lập hoặc lấy đường bao của một thành phần
Tạo đường viền với BorderFactory
Phương thức Mô tả
Border createLineBorder(Color)
Border createLineBorder(Color, int)
Tạo một đường viền. Đối số đầu tiên là đối tượng java.awt.Color dùng để lấy màu vẽ đường viền, đối số tùy chọn thứ hai là một số nguyên dùng để xác định độ dày đường viền.
Border createEtchedBorder()
Border createEtchedBorder(Color, Color)
Border createEtchedBorder(int)
Border createEtchedBorder(int, Color, Color)
Tạo đường viền dạng nét khắc. Đối số tùy chọn Color xác định màu highlight và màu của bóng. Còn phương thức với đối số kiểu int thì giá trị có thể là EtchedBorder.RAISED hoặc EtchedBorder.LOWERED. Các phương thức mà không có đối số kiểu nguyên thì sẽ tạo đường viền khắc mức thấp.
Border createLoweredBevelBorder() Tạo đường viền cho thành phần, đường viền này sẽ làm cho thành phần có cảm giác thấp hơn so với các thành phần xung quanh.
Border createRaisedBevelBorder() Tạo đường viền cho cảm giác thành phần cao hơn so với xung quanh.
Border createBevelBorder(int, Color, Color)
Border createBevelBorder(int, Color, Color, Color, Color)
Tạo đường viền vát lên hoặc vát xuống, sử dụng màu sắc để tạo. Đối số là số nguyên có thể là BevelBorder.RAISED hoặc BevelBorder.LOWERED. Với hàm tạo 3 đối số thì bạn xác định các màu highlight và màu shadow. Còn với hàm tạo 5 đối số thì bạn xác định các màu ngoài (outer) highlight, trong highlight, ngoài và trong shadow theo thứ tự tương ứng.
Border createEmptyBorder()
Border createEmptyBorder(int, int, int, int)
Tạo đường viền ẩn. Nếu dùng phương thức không đối số thì đường viền tạo ra sẽ không có khoảng không, điều này hữu dụng tạo các loại đường viền có tiêu đề nhưng không có viền. Nếu dùng phương thức có đối số thì nó sẽ xác định số lượng điểm ảnh mà đường viền chiếm ở phía trên, trái, dưới và phải của thành phần sử dụng nó. Phương thức này hữu dụng khi đặt một không gian trống xung quanh thành phần.
MatteBorder createMatteBorder(int, int, int, int, Color)
MatteBorder createMatteBorder(int, int, int, int, Icon)
Tạo đường viền mờ. Các đối số kiểu nguyên dùng để xác định độ dày theo đơn vị pixel đối với phần top, left, bottom và right của thành phần sử dụng nó. Đối số màu sắc dùng để chỉ định màu cho đường viền. Đối số icon dùng để xác định icon là đặt liên tục nhau trong vùng của đường viền.
TitledBorder createTitledBorder(String)
TitledBorder createTitledBorder(Border)
TitledBorder createTitledBorder(Border, String)
TitledBorder createTitledBorder(Border, String, int, int)
TitledBorder createTitledBorder(Border, String, int, int, Font)
TitledBorder createTitledBorder(Border, String, int, int, Font, Color)
Tạo đường viền có tiêu đề. Đối số string dùng để xác định tiêu đề hiển thị cho đường viền. các đối số font và color tùy chọn dùng để xác định font và màu sắc được dùng cho văn bản của tiêu đề. Đối số border dùng để xác định đường viền sẽ được hiển thị cùng với tiều đề. Nếu không có đường viền nào được xác định thì đường viền look-and-feel-specific mặc định sẽ được sử dụng.

Mặc định thì tiêu đề sẽ nằm ở phía trên giữa của phần đường bao và được dịch trái. Các đối số có kiểu nguyên dùng để xác định vị trí và canh cho tiêu đề. TitledBorder sẽ định nghĩa những vị trí có thể có gồm: ABOVE_TOPTOP (mặc định), BELOW_TOPABOVE_BOTTOMBOTTOM và BELOW_BOTTOM. Ta có thể canh lề là LEADING (mặc định), CENTER hoặc TRAILING. Đối với những quốc gia áp dụng bảng chữ cái phương tây thì LEADING tương ứng với LEFT và TRAILING tương ứng với RIGHT.

CompoundBorder createCompoundBorder(Border, Border) Phương thức này sẽ kết hợp hai đường bao làm một. Đối số thứ nhất xác định đường bao ngoài, và đối số thứ hai xác định đường bao trong.

 

Thiết lập hoặc lấy đường bao của thành phần

Phương thức Mô tả
void setBorder(Border)
Border getBorder()
Thiết lập hoặc lấy đường bao của JComponent nhận được.
void setBorderPainted(boolean)
boolean isBorderPainted()
(trong AbstractButtonJMenuBarJPopupMenuJProgressBar, and JToolBar)
Thiết lập hoặc lấy đường bao của thành phần cần được hiển thị.

Ví dụ có sử dụng Border

» Tiếp: Cách sử dụng Icon
« Trước: JTextPane
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!