SSCCE.
1) / API.
2) , JFrame. /, Thread#sleep(int), Runnable.
3) ( OP), Thread#sleep(int) EDT, GUI .
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.Border;
public class MultiSizedPanels {
private static void createAndShowUI() {
final CardLayout cardLayout = new CardLayout();
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;
Dimension size = labels[i].getPreferredSize();
size = new Dimension(size.width + 2 * (i + 1) * padding, size.height + 2 * (i + 1) * padding);
labels[i].setPreferredSize(size);
Border lineBorder = BorderFactory.createLineBorder(Color.blue);
labels[i].setBorder(lineBorder);
JPanel containerPanel = new JPanel();
if (i == 1) {
containerPanel.setPreferredSize(new Dimension(300, 200));
containerPanel.add(labels[i], BorderLayout.CENTER);
cardHolder.add(containerPanel, String.valueOf(i));
} else if (i == 2) {
containerPanel.setPreferredSize(new Dimension(600, 400));
containerPanel.add(labels[i], BorderLayout.CENTER);
cardHolder.add(containerPanel, String.valueOf(i));
} else {
containerPanel.setPreferredSize(new Dimension(800, 600));
containerPanel.add(labels[i], BorderLayout.CENTER);
cardHolder.add(containerPanel, String.valueOf(i));
}
}
JButton nextButton = new JButton("Next");
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardLayout.next(cardHolder);
Dimension dim = new Dimension();
for (Component comp : cardHolder.getComponents()) {
if (comp.isVisible() == true) {
dim = comp.getPreferredSize();
}
}
frame.setPreferredSize(dim);
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
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);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}