Dịch từ: Java Programming Fifth Edition của Joyce Farrell
LEARNING MORE ABOUT LAYOUT MANAGERS
Một layout manager là một đối tượng mà nó điều khiển kích thước và vị trí của các component bên trong đối tượng (object) Container.
Layout manager mà bạn đăng ký ( assign) đến window xác định ( determine )về các component được chỉnh sửa về kích thước và vị trí bên trong window.
Cho ví dụ, bạn luôn luôn học rằng FlowLayout layout manager xác định component trên hàng ( row) từ trái qua phải trong container của chúng. Layout manager là lớp giao diện (interface) là một phần của JDK; chúng sắp xếp (align) các component của bạn nếu không nhóm ( crow) mỗi cái thì xếp chồng chéo lên nhau.
Cho ví dụ, một layout manager sắp xếp các component trong một không gian đồng đều giữa các hàng và các cột; layout manager khác tập trung( center) các component bên trong container; mỗi component bạn đặt bên trong một Container có thể chính là một Container của nó, vì vậy bạn có thể đăng ký layout manager ở bên trong layout manager.
Nền (platform) Java hỗ trợ ( supply) layout manager sắp xếp từ những thứ đơn giản (Flowlayout và GridLayout) đến những có mục đích đặc biệt (BorderLayout và CardLayout) đến những thứ rất phức tạp ( GridBagLayout và BoxLayout)
Bảng 14-2 liệt kê mỗi layout manager và trạng thái của chúng khi được sử dụng:
Layout manager | Khi được sử dụng |
BorderLayout | Sử dụng khi bạn thêm các component đến tối đa 5 phần được sắp xếp phía bắc, nam, đông và tây và vị trí trung tâm. |
FlowLayout | Sử dụng khi bạn cần thêm các component từ trái sang phải; FlowLayout tự động di chuyển đến hàng kế tiếp khi cần, và mỗi component sẽ có một kích thước phù hợp hơn. |
GridLayout | Sử dụng khi bạn cần thêm các component vào bên trong một lưới của các hàng và các cột; mỗi component có kích thước giống nhau. |
CardLayout | Sử dụng khi bạn |
BoxLayout | Sử dụng khi bạn cần thêm các component vào bên trong một hàng đơn hoặc một cột đơn |
GridBagLayout | Sử dụng khi bàn cần cài đặt kích thước, địa chỉ và sắp xếp ràng buộc cho mọi component mà bạn thêm. |
Table 14-2: Java layout managers.
USING BORDERLAYOUT
BorderLayout Manager là một lớp quản lý mặc định cho tất cả content pane. Bạn có thể sử dụng lớp BorderLayout với bất kỳ container mà bạn có 5 hoặc ít thành phần hơn. ( Tuy nhiên, bất kỳ các component có thể là một container mà bạn nắm giữ các components khác).
Khi bạn sử dụng quản lý BorderLayout, các components điền trên màn hình trên 5 khu vực: north, east, west, và center.
Hình ảnh 14-10 biểu diễn một Jframe mà có chứa 5 đối tượng JButton mà nó điền 5 khu vực trong một content pane mà sử dụng BorderLayout.
Khi bạn thêm một component dến một container mà bạn sử dụng BorderLayout, phương thức add() sử dụng 2 tham số ( argument): component và khu vực mà bạn được thêm.
Lớp BorderLayout cung cấp 5 hằng số được đặt tên cho các khu vực ( regions) :
1. BorderLayout.NORTH (.north)
2. BorderLayout.SOUTH (.south)
3. BorderLayout.WEST (.west)
4. BorderLayout.EAST (.east)
5. BorderLayout.CENTER (.center)
Hình ảnh 14-11 biểu diễn một lớp mà bạn tạo ra kết quả như hình ảnh 14-10.
*
package usingborderlayout;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
public class JDemoBorderLayout extends JFrame {
private final int JFRAME_X_ORIGIN = 250;
private final int JFRAME_Y_ORIGIN = 300;
private final int JFRAME_WIDTH = 400;
private final int JFRAME_HEIGHT = 150;
private JButton nb = new JButton("North Button");
private JButton sb = new JButton("South Button");
private JButton eb = new JButton("East Button");
private JButton wb = new JButton("West Button");
private JButton cb = new JButton("Center Button");
public JDemoBorderLayout(){
super("JFrame");
//ADD MANAGER LAYOUT
setLayout(new BorderLayout());
//ADD FIVE JBUTTONS WITH 5 REGIONS
add(nb, BorderLayout.NORTH);
add(sb, BorderLayout.SOUTH);
add(eb, BorderLayout.EAST);
add(wb, BorderLayout.WEST);
add(cb, BorderLayout.CENTER);
//Set the color for Buttons
nb.setBackground(Color.BLUE);
sb.setBackground(Color.CYAN);
eb.setBackground(Color.GREEN);
wb.setBackground(Color.ORANGE);
cb.setBackground(Color.red);
setVisible(true);
setSize(JFRAME_WIDTH, JFRAME_HEIGHT);
setLocation(JFRAME_X_ORIGIN,JFRAME_Y_ORIGIN);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args){
JDemoBorderLayout frame = new JDemoBorderLayout();
}
}
>>NOTE: Khi bạn sử dụng BorderLayout, bạn có thể sử dụng các hằng số (constants ) PAGE_START, PAGE_END, LINE_START, LINE_END VÀ CENTER, thay thế NORT, SOUTH, EAST, WEST và CENTER. Thay vì sử dụng các tham chiếu địa lý, những hằng số này cho bạn có thể hình dung trên trang in.
Khi bạn đánh địa chỉ chính xác 5 components trong một container và sử dụng BorderLayout, mỗi component điền vào toàn bộ một khu vực, như minh họa (illustrated) trong hình 14-10 . Khi một ứng dụng chạy, Java chỉ dẫn chính xác kích thước của mỗi component trên cơ sở nội dung của component ( component’s content). Khi bạn thay đổi kích thước của Container mà nó sử dụng BorderLayout, các khu vực cũng được thay đổi kích thước. Nếu bạn vẽ các đường biên của Container để làm cho nó rộng hơn ( wider ), phía bắc, phái nam và cùng trung tâm sẽ rộng hơn nhưng phía tây và phía đông không thay đổi.
Nếu bạn tăng chiều cao của Container (height), phía đông, tây và khu vực trung tâm sẽ trở nên cao hơn, nhưng phía bắc và nam không thay đổi.
Khi bạn tạo ra một Container có tên là con, bạn có thể thiết lập layout manager của nó là BorderLayout với đoạn code sau:
con.setLayout(new BorderLayout() );
Tương tự, bên trong một lớp con của Jframe, bạn có thể sử dụng đoạn code sau để thiết lập layout manager :
setLayout ( new BorderLayout());
this.setLayout(new BorderLayout());
Tuy nhiên, nó thì không cần thiết để sử dụng với bất kỳ đoạn code nào để định rõ BorderLayout bởi vì nó đã được mặc định làm layout manager cho tất cả content pane
Khi bạn sử dụng BorderLayout, bạn không thể yêu cầu thêm các components vào bên trong 5 khu vực. Nếu bạn thêm ít hơn component, vài khu vực trống sẽ không xuất hiện, và điều này có nghĩa là các components sẽ mở rộng để điền vào những không gian thích hợp. Nếu bất kỳ hay toàn bộ phía bắc, nam, tây hoặc đông bị loại bỏ, khu vực trung tâm sẽ mở rộng vào bên trong những khu vực đó. Tuy nhiên, nếu khu vực trung tâm bị loại bỏ thì những khu vực như bắc, nam, đông và tây sẽ không thay đổi.
USING FLOWLAYOUT
Với FlowLayout, mỗi Component mà bạn thêm được đánh địa chỉ phía bên phải của Component được đánh trước đó trên cùng hàng; hoặc nếu hàng đã được điền đầy thì Component sẽ được bắt đầu đánh địa chỉ trên hàng mới.
Khi bạn sử dụng BorderLayout, các Components mà bạn điền vào những khu vực của chúng , mỗi Component sẽ được trải rộng (expand) hoặc co rút (contracts) dựa trên cơ sở kích thước của khu vực. Tuy nhiên khi bạn sử dụng FlowLayout, mỗi Component giữ ( retain) một kích thước mặc định hoặc ưu tiên hơn (preferred size).
Cho một ví dụ, một kích thước ưu tiên hơn của một JButton ( JButton’s preferred size) là kích thước mà nó thì đủ rộng để nắm giữ JButton’s text.
Khi bạn sử dụng BorderLayout và thay đổi lại kích thước của window, các Component thay đổi kích thước xảy ra bởi vì các khu vực của chúng thay đổi.
Khi bạn sử dụng FlowLayout và sau đó thay đổi kích thước window, mỗi Component giữ lại kích thước của nó, nhưng nó có thể bị che đi một phần hoặc thay đổi vị trí.
Lớp FlowLayout chứa 3 hằng số mà bạn có thể sử dụng để sắp xếp Components với Container:
>>FlowLayout.LEFT
>>FlowLayout.CENTER
>>FlowLayout.RIGHT
Nếu bạn không có sự sắp xếp nào đặc biệt, các Components sẽ được mặc định sắp xếp tại vị trí trung tâm trong một FlowLayout của Container.
Hình ảnh 14-12 cho ta một ứng dụng sử dụng hằng số FlowLayout.LEFT và FLOWLAYOUT.RIGHT để chỉnh lại địa chỉ ( reposition) JButtons. Trong ví dụ, một đối tượng (object) FlowLayout có tên là layout được sử dụng để thiết lập (set) bố cục (layout) cho content pane. Khi người sử dụng click vào một button, phương thức actionPerformed() thay đổi cách sắp xếp sang trái hoặc sang phải sử dụng phương thức setAlignment trong lớp FlowLayout.
****
package usingflowlayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class JDemoFlowLayout extends JFrame implements ActionListener {
private static final int JFRAME_X_ORIGIN = 250;
private static final int JFRAME_Y_ORIGIN = 250;
private static final int JFRAME_WIDTH = 500;
private static final int JFRAME_HEIGHT = 100;
private JButton lb = new JButton("L Button");
private JButton rb = new JButton("R Button");
private Container con = getContentPane();
private FlowLayout layout = new FlowLayout();
public JDemoFlowLayout(){
super("Frame");
con.setLayout(layout);
add(lb);
add(rb);
lb.addActionListener(this);
rb.addActionListener(this);
setSize(JFRAME_WIDTH, JFRAME_HEIGHT);
setLocation(JFRAME_X_ORIGIN,JFRAME_Y_ORIGIN);
con.setBackground(Color.YELLOW);
lb.setBackground(Color.RED);
rb.setBackground(Color.CYAN);
setVisible(true);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if(source == lb){
layout.setAlignment(FlowLayout.LEFT);
}
else{
layout.setAlignment(FlowLayout.RIGHT);
}
con.invalidate();
con.validate();
}
public static void main(String[] args){
JDemoFlowLayout frame = new JDemoFlowLayout();
}
}
USING GRIDLAYOUT
Nếu bạn muốn sắp xếp các components bên trong các hàng và các cột bằng nhau, bạn có thể sử dụng lớp quản lý GridLayout manager. Khi bạn tạo ra một object GridLayout, bạn chỉ ra (indicate) số hàng và số cột mà bạn muốn, và sau đó bề mặt (surface ) của container được chia thành (divided into) một lưới, nhiều như (much like) màn hành mà bạn nhìn thấy khi sử dụng chương trình bảng tính (spreadsheet program). Cho ví dụ, đoạn code sau thiết lập (establishes) một GridLayout ẩn danh với bốn hàng ngang và 5 cột dọc trong một Container có tên là con:
con.setLayout(new GridLayout(4,5));
Tương tự, bên trong một Jframe, bạn có thể thiết lập một layout tương tự với dòng code khác như sau ( with either of the following):
this.setLayout(new GridLayout(4,5));
setLayout( new GridLayout(4,5));
Như bạn thêm Compoents mới đến một GridLayout, chúng được định vị ( positioned) trong một dãy từ trái qua phải thông qua mỗi hàng. (Không may (unfortunately ), bạn có thể thêm một nhãn trống đến một lưới định vị để đưa cho một vị trí ảo đang bỏ qua). Bạn luôn có thể chỉ định (specify) khoảng cách giữa một cột và một hàng được đo (mearsured in) bởi đơn vị điểm ảnh (pixels),sử dụng thêm 2 đối số.Cho ví dụ, hình ảnh 14-4 biểu diễn một chương trình JdemoGridLayout mà nó sự dụng đoạn code như sau ( được tô đậm) để thiết lập một GridLayout với 3 hàng và 2 cột và khoảng cách giữa mỗi hàng và các cột là 5 pixels :
5 JButton Components được thêm content pane lấy (retrieved) tự động của Jframe. Hình ảnh 14-15 biểu diễn kết quả. Components được đánh địa chỉ bên trong cửa sổ (pane) thông qua (across) các hàng. Bởi vì có 6 vị trí nhưng chỉ có 5 Components, một chỗ (điểm, spot) vẫn (remains) có thể dùng (available).
*****
package usinggridlayout;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class JDemoGridLayout extends JFrame{
private static final int JFRAME_X_ORIGIN = 250;
private static final int JFRAME_Y_ORIGIN = 250;
private static final int JFRAME_WIDTH = 500;
private static final int JFRAME_HEIGHT = 200;
JButton b1 = new JButton("Button 1");
JButton b2 = new JButton("Button 2");
JButton b3 = new JButton("Button 3");
JButton b4 = new JButton("Button 4");
JButton b5 = new JButton("button 5");
GridLayout layout = new GridLayout(3,2,5,5);
public JDemoGridLayout(){
super("JDemoGridLayout");
setLayout(layout);
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);
b1.setBackground(Color.red);
b2.setBackground(Color.BLUE);
b3.setBackground(Color.CYAN);
b4.setBackground(Color.yellow);
b5.setBackground(Color.pink);
setSize(JFRAME_WIDTH,JFRAME_HEIGHT);
setLocation(JFRAME_X_ORIGIN,JFRAME_Y_ORIGIN);
setVisible(true);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args){
JDemoGridLayout frame = new JDemoGridLayout();
}
}
>>NOTE: Với GridLayout, bạn có thể chỉ chỉ định (specify) số hàng, bạn có thể sử dụng 0 cho số cột và cho phép layout manager chỉ dẫn số cột, hoặc bạn có thể sử dụng số 0 cho số hàng, chỉ định số cột và cho phép layout manager tính toán số hàng. Tuy nhiên khi bạn không chỉ dẫn số hàng hoặc số cột, các Components được đánh địa chỉ bên trong GridLayout sẽ được điều chỉnh số hàng cột và điền vào những không gian thích hợp. Khi bạn sử dụng FlowLayout, Java chỉ dẫn số hàng, số cột ………………….
USING CARDLAYOUT
CardLayout Manager là tạo ra (generates) một ngăn xếp ( a stack) của các Containers hoặc các Components. Mỗi component nằm trong nhóm thì được dựa theo như một card, và mỗi card có thể là bất kỳ kiểu component nào. Cho ví dụ, một JButton, một Jlabel hoặc JPane. Bạn sử dụng một CardLayout khi bạn muốn rất nhiều (multiple) components để chia sẻ những không gian giống nhau.
Một card thì được tạo ra từ lớp CardLayout sử dụng một trong 2 cấu trúc (constructors):
>> CardLayout() tạo ra một card layout mà không có một khoảng cách ngang (horizontal) hay dọc(vertical).
>>CardLayout( int hgap, int vgap) tạo ra một card layout với chỉ định khoảng ngang và khoảng dọc. Khoảng ngang được đánh địa chỉ từ cạnh trái và cạnh phải. Khoảng dọc được đánh từ cạnh trên cùng và cạnh dưới.
Cho ví dụ, hình ảnh 14-16 cho ta một lớp JdemoCardLayout mà nó sử dụng CardLayout manager để tạo ra một stack của JButton mà nó chứa các nhãn (labels): “Ace of Hearts”, “Three of Spades”, và “Queen of Clubs”. Trong một cấu trúc lớp, bạn cần một chút sự khác biết của phương thức add() để thêm một component đến một content pane mà layout manager của nó là CardLayout.
Định dạng (format) của phương thức đó là:
add( aString, aContainer);
Trong đoạn code này, aString thực hiện một tên mà bạn muốn sử dụng đẻ định rõ Component Card được thêm (is added):
*****
package usingcardlayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class JDemoCardLayout extends JFrame implements ActionListener{
private static final int JFRAME_X_ORIGIN = 250;
private static final int JFRAME_Y_ORIGIN = 250;
private static final int JFRAME_WIDTH = 200;
private static final int JFRAME_HEIGHT = 100;
private CardLayout cards = new CardLayout();
private JButton b1 = new JButton("Ace of hearts");
private JButton b2 = new JButton("Three of Spades");
private JButton b3 = new JButton("Queen of Clubs");
public JDemoCardLayout(){
super("JDemoCardLayout");
setLayout(cards);
add("ace",b1); // ace = át chủ bài
add("three", b2);
add("queen", b3);
b1.setBackground(Color.CYAN);
b2.setBackground(Color.pink);
b3.setBackground(Color.red);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
setSize(JFRAME_WIDTH,JFRAME_HEIGHT);
setLocation(JFRAME_X_ORIGIN,JFRAME_Y_ORIGIN);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
cards.next(getContentPane());
}
public static void main(String[] args){
JDemoCardLayout frame = new JDemoCardLayout();
}
}
0 comments:
Post a Comment