Java 在CardLayout中显示不同的面板大小

Java 在CardLayout中显示不同的面板大小,java,swing,layout-manager,cardlayout,Java,Swing,Layout Manager,Cardlayout,我有一个JPanel(cardLayoutPanel),它的布局是CardLayout 我还有另外3个不同的面板(firstPagePanel,secondPagePanel,thirdPagePanel) firstPagePanel尺寸约为450x400 secondPagePanel尺寸约为800x600 thirdPagePanel尺寸约为1024x768 IcardLayoutPanel。添加所有3个面板,然后首先显示firstPagePanel作为我的视图 我想让我的程序先显示f

我有一个
JPanel
cardLayoutPanel
),它的布局是
CardLayout

我还有另外3个不同的面板(
firstPagePanel
secondPagePanel
thirdPagePanel

  • firstPagePanel
    尺寸约为450x400
  • secondPagePanel
    尺寸约为800x600
  • thirdPagePanel
    尺寸约为1024x768
I
cardLayoutPanel。添加所有3个面板,然后首先显示
firstPagePanel
作为我的视图

我想让我的程序先显示
firstPagePanel
的大小,即450x400 然后,如果显示
secondPagePanel
,它会将大小更改为800x600,如果显示
thirdPagePanel
,它会将大小更改为1024768

我没有猜测我的3个面板的大小,而是使用了
frame.getPreferredSize()
,但是我的第一个视图总是采用我的
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);
    }
}
最简单的方法是:

  • 卸下当前面板
  • 添加新面板
  • 将顶层容器打包
例如。
import java.awt.*;
导入java.awt.event.*;
导入java.awt.image.buffereImage;
导入javax.swing.*;
导入javax.swing.border.EmptyBorder;
公共类3sizegui{
公共静态无效swapComponentsAndResizeUI(
JComponentUI,
j组件电流,
JComponent(下一步){
ui.删除(当前);
ui.add(下一步);
当前=下一个;
组件c=ui.getToLevel祖先();
如果(窗口的c实例){
窗口w=(窗口)c;
w、 包装();
}
}
公共静态void main(字符串[]args){
Runnable r=新的Runnable(){
@凌驾
公开募捐{
最终JPanel ui=新JPanel(新边界布局(4,4));
ui.setboorder(新的空订单(6,6,6,6));
JPanel控件=新JPanel(
新的FlowLayout(FlowLayout.LEADING));
添加(控件、边框布局、页面开始);
int s=100;
维度[]大小={
新尺寸(s*4,s*2),
新尺寸(s*6,s*3),
新尺寸(s*8,s*4)
};
最终JCOMBOX cb=新JCOMBOX(尺寸);
控制。添加(cb);
最终JPanel[]面板=新JPanel[size.length];
对于(int ii=0;ii
我会问为什么。这种“跳跃”对于用户来说是非常烦躁和恼人的,因为如果我将第一页面板的大小保持在第三页面板的大小,它看起来会很奇怪
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);
    }
}