java - 在CardLayout中显示不同的面板尺寸

标签 java swing layout-manager cardlayout

我有一个 JPanel (cardLayoutPanel),其布局为 CardLayout

我还有另外 3 个不同的面板(firstPagePanelsecondPagePanelthirdPagePanel)

  • firstPagePanel 大小约为 450x400 左右,
  • secondPagePanel 大小约为 800x600
  • thirdPagePanel 大小约为 1024x768 左右

cardLayoutPanel.add 所有 3 个面板,并且首先显示 firstPagePanel 作为我的 View 。

我想让我的程序首先显示 firstPagePanel 的大小,即 450x400 然后,如果显示 SecondPagePanel,则将尺寸更改为 800x600,如果显示 ThirdPagePanel,则将尺寸更改为 1024,768

我没有猜测我的 3 个面板的大小应该是多少,而是使用了 frame.getPreferredSize() 但我的第一个 View 将始终采用我的 thirdPagePanel 的大小,即1024x768 而不是 450x400;

我可以做什么来解决这个问题?

public class MainFrame { 
    private CardLayout cardLayout = new CardLayout();
    private JPanel cardLayoutPanel = new JPanel();
    private FirstPagePanel firstPagePanel = new FirstPagePanel(); 
    private SecondPagePanel secondPagePanel = new SecondPagePanel();    
    private ThirdPagePanel thirdPagePanel = new ThirdPagePanel();
    private JFrame frame = new JFrame("Panel size test");

    public MainFrame() {
        cardLayoutPanel.setLayout(cardLayout);
        cardLayoutPanel.add(firstPagePanel,"1");
        cardLayoutPanel.add(secondPagePanel,"2");
        cardLayoutPanel.add(thirdPagePanel,"3");
        cardLayout.show(cardLayoutPanel,"1");
        frame.add(cardLayoutPanel);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.getPreferredSize();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setResizable(false);
    }
}

最佳答案

最简单的方法是:

  • 删除当前面板。
  • 添加新面板。
  • 包装顶层容器。

EG

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class ThreeSizeGui {

    public static void swapComponentsAndResizeUI(
            JComponent ui, 
            JComponent current,
            JComponent next) {
        ui.remove(current);
        ui.add(next);
        current = next;
        Component c = ui.getTopLevelAncestor();
        if (c instanceof Window) {
            Window w = (Window) c;
            w.pack();
        }
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                final JPanel ui = new JPanel(new BorderLayout(4, 4));
                ui.setBorder(new EmptyBorder(6, 6, 6, 6));

                JPanel controls = new JPanel(
                        new FlowLayout(FlowLayout.LEADING));
                ui.add(controls, BorderLayout.PAGE_START);
                int s = 100;
                Dimension[] sizes = {
                    new Dimension(s * 4, s * 2),
                    new Dimension(s * 6, s * 3),
                    new Dimension(s * 8, s * 4)
                };
                final JComboBox cb = new JComboBox(sizes);
                controls.add(cb);
                final JPanel[] panels = new JPanel[sizes.length];
                for (int ii = 0; ii < sizes.length; ii++) {
                    Dimension d = sizes[ii];
                    BufferedImage bi = new BufferedImage(
                            d.width, d.height, BufferedImage.TYPE_INT_RGB);
                    JPanel p = new JPanel(new GridLayout());
                    JLabel l = new JLabel(new ImageIcon(bi));
                    p.add(l);
                    panels[ii] = p;
                }
                ItemListener sizeListener = new ItemListener() {

                    JPanel current = panels[0];

                    @Override
                    public void itemStateChanged(ItemEvent e) {
                        JPanel next = panels[cb.getSelectedIndex()];
                        swapComponentsAndResizeUI(ui, current, next);
                        current = next;
                    }
                };
                cb.addItemListener(sizeListener);

                ui.add(panels[0], BorderLayout.CENTER);

                JFrame f = new JFrame("Three Sized Panels");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setContentPane(ui);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

关于java - 在CardLayout中显示不同的面板尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25346547/

相关文章:

java - 如何从cxf的WebClient获取已检查的异常或如何处理异常

java - Spring LDAP Authentication 的用户账户概念

java - JTable resize table header 自动滚动

空布局上的 Java 图形

java - ajax调用后将响应重定向到另一个jsp

java - 使用 Java 包装 C++

java - 重用初始化耗时的Swing组件

java - 无法通过 jTextField 显示所有对象的属性

java - 使用 KeyListner 接口(interface)的方法删除 JButton

java - GroupLayout - 简单的组件定位