Chú ý: Trước khi bắt đàu thiết kế một Layout Manager, chắc chắn rằng không tồn tại một Layout
Manager sè hoạt động. Cá biệt, GridBagLayout đủ mềm dẻo để làm việc trong nhiều trường hợp khác nhau.
Để tạo một Layout Manager, bạn phải tạo một lớp để thực thi giao diện LayoutManager. LayoutManager yêu cầu quan hệ chặt chẽ với nó để thực thi năm phương thức:
public void addLayoutComponent(String name, Component comp) Chỉ được gọi bằng phương thức add(name, component) của Container.
public void removeLayoutComponent(Component comp) Gọi bởi những phương thức remove() và removeAll() của Container. public Dimension preferredLayoutSize(Container parent)
Gọi bởi phương thức preferredSize() của Container, có thể tự gọi dưới mọi tình huống. public Dimension minimumLayoutSize(Container parent)
Gọi bởi phương thức minimumSize() của Container, có thể tự gọi dưới mọi tình huống. public void layoutContainer(Container parent)
Gọi khi Container hiển thị lần đầuis first displayed, và mọi lúc nó tahy đổi kích thước.
c. Làm việc thiếu Layout Manager
Mặc dù có thể làm việc mà không cần Layout Manager, bạn nên dùng Layout Manager nếu có thể. Layout managers dể thay đổi kích thước của Container và điều chỉnh hình dạng của các thành phần phụ thuộc vào Platform. Nó cùng có thể được sử dụng lạ bới các Container va các chương trình khác. nếu Custom Container sè không tái sử dụng, không thể thay đổi kích thước, và hoàn toàn có thể điều khiển được các thông số phụ thuộc vào hệ thống như Font và hình dạng các thành phần.
Ví dụ:
public class NoneWindow extends Frame { . . .
private boolean laidOut = false; private Button b1, b2, b3;
public NoneWindow() { super();
setLayout(null);
setFont(new Font("Helvetica", Font.PLAIN, 14)); b1 = new Button("one"); add(b1); b2 = new Button("two"); add(b2); b3 = new Button("three"); add(b3); }
public void paint(Graphics g) { if (!laidOut) {
Insets insets = insets(); /*
* We're guaranteed that insets() will return a valid Insets
* if called from paint() -- it isn't valid when called from
* the constructor. *
* We could perhaps cache this in an ivar, but insets can * change, and when they do, the AWT creates a whole new * Insets object; the old one is invalid.
*/
b1.reshape(50 + insets.left, 5 + insets.top, 50, 20); b2.reshape(70 + insets.left, 35 + insets.top, 50, 20); b3.reshape(130 + insets.left, 15 + insets.top, 50, 30); laidOut = true; } } . . . }