通常是:如果您遇到布局问题,请 始终 使用适当的LayoutManager解决它。 切勿 调整组件的大小提示以达到您的目标。
在这种情况下,调整CardLayout特别容易。默认情况下,它将其prefSize计算为所有卡的prefSizes的最大值。只需子类化并实现以返回当前可见卡的prefSize(加上插图)即可:
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; }}
使用该方法(借用@mKorbel的示例),主要方法完全缩小了:
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);}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)