GroupLayout
không hỗ trợ định tâm các thành phần. Trình quản lý bố cục rất có khả năng. Cá nhân tôi đặt nó sau người quản lý MigLayout
và trước người quản lý FormLayout
.
Trong ba ví dụ sau, chúng tôi có một bảng điều khiển và một nút. Nút được đặt ở giữa theo chiều ngang.
Định tâm với NetBeans Builder
Để đặt một thành phần sử dụng Netbeans Builder, chúng ta cần tạo ngang resizable khoảng cách từ hai phía của nút.
Diện tích màu xanh lá cây của ảnh chụp màn hình là khoảng trống hiện được chọn. Các chuỗi bên trong khoảng trống cho thấy rằng đó là một khoảng cách thay đổi kích thước.
Các khoảng trống sẽ được tự động thêm vào khi chúng ta đặt các thành phần trên biểu mẫu. Để xác định khoảng cách có thể thay đổi kích thước, chúng tôi nhấp chuột phải vào khoảng trống và chọn tùy chọn "Chỉnh sửa bố cục". Chúng tôi nhận được hộp thoại sau:
Để có được một khoảng cách thay đổi kích thước, chúng tôi kiểm tra hộp kiểm Resizable.
Định tâm bằng tay bằng cách sử dụng một nhóm song song
Linh kiện có thể được tập trung trong nhóm song song bằng cách thông qua các tham số GroupLayout.Alignment.CENTER
.
package com.zetcode;
import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import static javax.swing.GroupLayout.Alignment.CENTER;
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GroupLayoutCenter extends JFrame {
public GroupLayoutCenter() {
initUI();
setTitle("Centered button");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private void initUI() {
Container pane = getContentPane();
GroupLayout gl = new GroupLayout(pane);
pane.setLayout(gl);
gl.setAutoCreateGaps(true);
gl.setAutoCreateContainerGaps(true);
JPanel pnl = new JPanel();
pnl.setBorder(BorderFactory.createEtchedBorder());
JButton btn = new JButton("Button");
gl.setHorizontalGroup(gl.createParallelGroup(CENTER)
.addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
.addComponent(btn)
);
gl.setVerticalGroup(gl.createSequentialGroup()
.addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
.addComponent(btn)
);
pack();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
GroupLayoutCenter ex = new GroupLayoutCenter();
ex.setVisible(true);
}
});
}
}
Định tâm bằng tay bằng cách sử dụng những khoảng trống
Giải pháp này là những gì NetBeans tạo ra mã lệnh thực hiện. Chúng tôi đặt hai khoảng trống có thể thay đổi kích thước ở bên trái và bên phải của nút.
package com.zetcode;
import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GroupLayoutCenter2 extends JFrame {
public GroupLayoutCenter2() {
initUI();
setTitle("Centered button");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private void initUI() {
Container pane = getContentPane();
GroupLayout gl = new GroupLayout(pane);
pane.setLayout(gl);
gl.setAutoCreateGaps(true);
gl.setAutoCreateContainerGaps(true);
JPanel pnl = new JPanel();
pnl.setBorder(BorderFactory.createEtchedBorder());
JButton btn = new JButton("Button");
gl.setHorizontalGroup(gl.createParallelGroup()
.addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
.addGroup(gl.createSequentialGroup()
.addGap(5, 100, Short.MAX_VALUE)
.addComponent(btn)
.addGap(5, 100, Short.MAX_VALUE))
);
gl.setVerticalGroup(gl.createSequentialGroup()
.addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
.addComponent(btn)
);
pack();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
GroupLayoutCenter2 ex = new GroupLayoutCenter2();
ex.setVisible(true);
}
});
}
}
trường hợp (i nghĩ rằng đó là rất thường xuyên) là bạn có một hình thức với nhiều điều khiển. Cách bố trí các điều khiển làm cho GroupLayout trở thành một lựa chọn hoàn hảo. Ngoại trừ nút ở cuối, cần phải căn giữa. Tất nhiên tôi có thể đặt một JPanel ở cuối trang, làm cho nó có thể thay đổi kích thước theo chiều ngang và đưa vào (mặc định) trung tâm của nó FlowLayout JButton. Nhưng câu hỏi phát sinh từ thực tế là trong các nhà xây dựng GUI khác (không quá phức tạp) như của Delphi, việc định tâm là một phần mở rộng birllant của logic neo đậu. Không neo một điều khiển đến bất cứ nơi nào có nghĩa là để cho nó "nổi" ở trung tâm. – AgostinoX
@AgostinoX bạn sẽ có rất nhiều bất ngờ với 'LayoutManager' này Pete +1 – mKorbel
@mKorbel, tôi không vui khi nghe điều đó :-). bạn có thể cung cấp một vài mẫu không? – AgostinoX