Il generale è: se avete un problema di layout, sempre risolverlo con una LayoutManager appropriata. Mai modificare il suggerimento di ridimensionamento di un componente per raggiungere l'obiettivo.
In questo caso, è particolarmente semplice regolare il CardLayout. Per impostazione predefinita, calcola il suo prefSize al massimo di prefSize di tutte le carte. Semplicemente sottoclasse e implementare per restituire la prefSize (più inserti) della scheda attualmente visibile:
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;
}
}
Utilizzando che (indebitamento @ l'esempio di mKorbel), il metodo principale si restringe in modo pulito giù:
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);
}
* "Voglio che JFrame si adatti alle dimensioni del JPanel attualmente visualizzato" * Sarebbe strano per l'utente avere una dimensione di modifica del frame solo perché il contenuto visualizzato cambia. –
Avere una dimensione fissa JFrame è piuttosto brutto quando il pannello interno non corrisponde. L'ho provato. – JVerstry
Non sono sicuro che funzionerà, ma puoi provare questo: 'frame.setSize (pannello.getPreferredSize()); ' –