Tổng là: nếu bạn có một vấn đề bố trí, luôn giải quyết nó với một LayoutManager thích hợp. Không bao giờ tinh chỉnh gợi ý định kích thước của một thành phần để đạt được mục tiêu của bạn.
Trong trường hợp này, việc điều chỉnh CardLayout rất dễ dàng. Theo mặc định, nó tính toán prefSize của nó đến tối đa prefSizes của tất cả các thẻ. Đơn giản chỉ cần phân lớp và thực hiện để trả lại prefSize (cộng insets) của thẻ hiện thời hiển thị:
public static class MyCardLayout extends CardLayout {
@Override
public Dimension preferredLayoutSize(Container parent) {
Component current = findCurrentComponent(parent);
if (current != null) {
Insets insets = parent.getInsets();
Dimension pref = current.getPreferredSize();
pref.width += insets.left + insets.right;
pref.height += insets.top + insets.bottom;
return pref;
}
return super.preferredLayoutSize(parent);
}
public Component findCurrentComponent(Container parent) {
for (Component comp : parent.getComponents()) {
if (comp.isVisible()) {
return comp;
}
}
return null;
}
}
dùng đó (vay @ dụ mKorbel của), phương pháp chính sạch co lại xuống:
private static void createAndShowUI() {
final CardLayout cardLayout = new MyCardLayout();
final JPanel cardHolder = new JPanel(cardLayout);
final JFrame frame = new JFrame("MultiSizedPanels");
JLabel[] labels = {
new JLabel("Small Label", SwingConstants.CENTER),
new JLabel("Medium Label", SwingConstants.CENTER),
new JLabel("Large Label", SwingConstants.CENTER)};
for (int i = 0; i < labels.length; i++) {
int padding = 50 * (i + 1);
Border lineBorder = BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(Color.blue),
BorderFactory.createEmptyBorder(padding, padding, padding, padding));
labels[i].setBorder(lineBorder);
JPanel containerPanel = new JPanel();
containerPanel.add(labels[i]);
cardHolder.add(containerPanel, String.valueOf(i));
}
JButton nextButton = new JButton("Next");
nextButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.next(cardHolder);
frame.pack();
}
});
JPanel btnHolder = new JPanel();
btnHolder.add(nextButton);
frame.add(cardHolder, BorderLayout.CENTER);
frame.add(btnHolder, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
* "Tôi muốn JFrame thích nghi với kích thước của JPanel hiện đang được hiển thị" * Sẽ cảm thấy lạ khi người dùng có kích thước thay đổi khung hình chỉ vì thay đổi nội dung được hiển thị. –
Có kích thước sửa lỗi JFrame khá xấu khi bảng điều khiển bên trong không khớp. Tôi đã thử nó. – JVerstry
Tôi không chắc chắn điều này sẽ làm việc nhưng bạn có thể thử điều này: 'frame.setSize (bảng điều khiển.getPreferredSize()); ' –