El general es: si tiene un problema de diseño, siempre resolverlo con un LayoutManager apropiado. Nunca modifique la sugerencia de dimensionamiento de un componente para alcanzar su objetivo.
En este caso, es particularmente fácil ajustar CardLayout. Por defecto, calcula su prefSize al máximo de prefSizes de todas las cartas. Simplemente subclase e implementar para devolver el prefSize (además de inserciones) de la tarjeta visible en ese momento:
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;
}
}
Usando esa (endeudamiento @ ejemplo de mKorbel), el principal método reduce limpiamente:
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);
}
* "Quiero que el JFrame se adapte al tamaño del JPanel que se muestra actualmente" * Sería extraño para el usuario tener un tamaño de cambio de fotograma simplemente porque el contenido mostrado cambia. –
Tener un tamaño de corrección JFrame es bastante feo cuando el panel interno no coincide. Lo intenté. – JVerstry
No estoy seguro de que esto funcione pero puede intentar esto: 'frame.setSize (panel.getPreferredSize()); ' –