【问题标题】:Display different panel size in CardLayout在 CardLayout 中显示不同的面板大小
【发布时间】:2014-08-17 05:28:28
【问题描述】:

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

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

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

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

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

我没有猜测我的 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);
    }
}

【问题讨论】:

  • 我会质疑为什么。作为用户,这种“跳跃”非常令人心烦意乱,有点烦人,恕我直言
  • 因为如果我保持我的 firstPagePanel 大小与我的 thirdPagePanel 大小一样大,它会看起来很奇怪

标签: java swing layout-manager cardlayout


【解决方案1】:

最简单的方法是:

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

例如

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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2016-09-05
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多