Java: Cách sử dụng Panel
Lớp JPanel class dùng để cung cấp bộ chứa các thành phần nhẹ (lightweight). Mặc định thì panel không thêm màu cho bất kỳ thành phần nào ngoại trừ màu nên của nó; tuy nhiên, ta có thể thêm đường viền cho nó và cũng có thể tùy chỉnh painting của nó.
Trong nhiều loại look and feel thì mặc định panel là trong suốt, loại panel này cũng làm việc tương tự như content pane và có thể hỗ trợ thêm hiệu ứng painting được mô tả trong bài viết Cách sử dụng bộ chứa mức top. Ta có thể thay đổi độ trong suốt của panel bằng cách gọi phương thức setOpaque
. Panel trong suốt là panel không có nền, vậy nên ta có thể nhìn thấy bất kỳ thành phần nào của nó.
Ví dụ
Hình dưới đây thể hiện ứng dụng có tên Converter
.
Ví dụ Converter
sử dụng các panel như sau:
- Một thể hiện của
JPanel
— vùng màu đỏ — được dùng như là content pane, content pane này sử dụngBoxLayout
top-to-bottom để bố cục nội dung của nó, và một đường viền độ dày 5 pixel bao quanh nó. - Hai thể hiện của lớp con của
JPanel
có tênConversionPanel
— vùng màu xanh lục lam — dùng để chứa các thành phần cũng như thiết lập vị trí giữa chúng.ConversionPanel
cũng chứa đường viền có tiêu đề dùng để mô tả nội dung. Mỗi panelConversionPanel
sử dụng một đối tượngBoxLayout
left-to-right để bố cục nội dung. - Trong mỗi panel
ConversionPanel
, lại có một thể hiện nữa củaJPanel
— vùng đỏ tím (magenta) — dùng để thiết lập kích thước và vị trí đúng cho combo box. Mỗi thể hiện củaJPanel
sử dụng một đối tượngBoxLayout
top-to-bottom (được hỗ trợ bởi thành phần space-filling ẩn) để bố cục cho combo box. - Trong mỗi
ConversionPanel
cũng có thể hiện của lớp conJPanel
không có tên — màu xanh blue — dùng để chứa hai thành phần text field và slider. Mỗi thể hiện củaJPanel
này sử dụng đối tượngBoxLayout
top-to-bottom để bố cục cho các nội dung của nó.
Đây là kết quả thực tế của ví dụ Converter
.
Như vậy ta thấy rằng các panel rất hữu dụng để chứa hoặc nhóm các thành phần, đơn giản hóa bố cục của chúng cũng như thiết lập các đường viền quanh các nhóm thành phần. Dưới đây ta sẽ tìm hiểu thêm về cách nhóm và bố cục các thành phần.
Thiết lập Layout Manager
Giống như các bộ chứa khác thì panel sử dụng layout manager để thiết lập vị trí và kích thước cho các thành phần của nó. Mặc định thì layout manager của panel là một thể hiện của FlowLayout
, nó có nhiệm vụ đặt nội dung của panel trên một hàng. Ta có thể dễ dàng tạo một panel sử dụng layout manager bất kỳ bằng cách gọi invoking phương thức setLayout
hoặc chỉ định một layout manager khi tạo panel; cách thứ hai hay được dùng hơn vì nó sẽ giúp tránh được việc phải tạo đối tượng FlowLayout
.
Câu lệnh dưới đây là một ví dụ về cách thiết lập layout manager khi tạo panel mà không sử dụng FlowLayout.
JPanel p = new JPanel(new BorderLayout()); //Nên dùng cách này
Tuy nhiên, cách tạo panel ở trên lại không làm việc được với BoxLayout
vì hàm tạo của BoxLayout
yêu cầu một bộ chứa được tạo sẵn. Dưới đây là một ví dụ có thể khắc phục được điều này bằng cách sử dụng BoxLayout
.
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
Thêm thành phần vào panel
Khi thêm thành phần vào panel thì ta sử dụng phương thức add()
. Những đối số của phương thức add
được chỉ định phụ thuộc vào layout manager mà panel sử dụng. Khi layout manager là FlowLayout
, BoxLayout
, GridLayout
, hoặc SpringLayout
thì ta thường dùng phương thức add
với một đối số như sau:
aFlowPanel.add(aComponent);
aFlowPanel.add(anotherComponent);
Khi layout manager là BorderLayout
thì ta cần cung cấp một đối số nữa để chỉ định vị trí cho thành phần được thêm vào panel. Ví dụ:
aBorderPanel.add(aComponent, BorderLayout.CENTER);
aBorderPanel.add(anotherComponent, BorderLayout.PAGE_END);
Còn với layout manager GridBagLayout
thì ta sử dụng phương thức add
đồng thời chỉ định GridBagConstraints cho mỗi thành phần.
API Panel
Hàm tạo | Mục đích |
---|---|
JPanel() JPanel(LayoutManager) |
Tạo một panel. Tham số LayoutManager cung cấp layout manager cho panel mới được tạo. Mặc định thì panel sử dụng FlowLayout để bố trí các thành phần của nó. |
Phương thức | Mục đích |
---|---|
void add(Component) void add(Component, int) void add(Component, Object) void add(Component, Object, int) void add(String, Component) |
Thêm thành phần được chỉ định vào panel. Tham số int là chỉ số của thành phần trong bộ chứa. Mặc định thì thành phần đầu tiên được thêm vào có chỉ số 0. Tham số Object là layout manager phụ thuộc và nó cung cấp thông tin cho layout manager thu thập vị trí và các ràng buộc bố cục khác cho thành phần được thêm. Tham số String tương tự như tham số Object . |
int getComponentCount() | Lấy số lượng các thành phần của panel. |
Component getComponent(int) Component getComponentAt(int, int) Component getComponentAt(Point) Component[] getComponents() |
Lấy thành phần được chỉ định. Ta có thể lấy một thành phần nào đó của panel dựa trên chỉ số của nó hoặc dựa trên tọa độ x, y của nó. |
void remove(Component) void remove(int) void removeAll() |
Xóa các thành phàn được chỉ định. |
Phương thức | Mục đích |
---|---|
void setLayout(LayoutManager) LayoutManager getLayout() |
Thiết lập hoặc lấy layout manager cho panel. Layout manager sẽ cung cấp vị trí của các thành phần của panel. |