【问题标题】:CardLayout() in java GUIJava GUI 中的 CardLayout()
【发布时间】:2018-05-05 01:59:07
【问题描述】:

在我的代码中,目前每张卡片都是我框架的大小。如何在布局中设置每个面板的不同大小。我尝试通过调用 run() 方法并更改框架的大小来使框架大小不同,但它不起作用。我希望有另一种方法。 这是我的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class GameManager
{
    JFrame frame;
    JPanel cards,Title;
    public GameManager()
    {
        cards = new JPanel(new CardLayout());
        Title title = new Title();
        cards.add(title,"title");
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, "title");
    }
    public static void main(String [] args)
    {
        GameManager gm = new GameManager();
        gm.run();
    }
    public void run()
    {
        frame = new JFrame("Greek Olympics");
        frame.setSize(1000,1000);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(cards);
        frame.setVisible(true);
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, "title");
    }
    public class Title extends JPanel
    {
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.fillRect(100,100,100,100);
        }
    }
}

如果我想添加另一个大小不同的面板,我将如何更改代码?

【问题讨论】:

    标签: java swing layout-manager cardlayout


    【解决方案1】:

    如何在布局中设置每个面板的不同尺寸

    首先,了解CardLayout 将使用它所管理的所有视图的preferredSize 属性来确定它所管理的容器应该使用的最佳结果大小。这意味着如果您在框架上调用pack(而不是setSize),它将(自动)调整为(由CardLayout)管理的最大组件

    如果我想添加另一个大小不同的面板,我应该如何更改代码?

    您添加到CardLayout 的每个组件都应该通过一个或多个适当的布局管理器计算其大小,或者在自定义组件的情况下,通过getPreferredSize 方法提供大小提示

    public class Title extends JPanel
    {
        @Override 
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    
        @Override
        protected void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.fillRect(100,100,100,100);
        }
    }
    

    然后,不要使用setSize,而是使用pack

    public void run()
    {
        frame = new JFrame("Greek Olympics");
        //frame.setSize(1000,1000);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(cards);
        frame.pack();
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, "title");
        frame.setVisible(true);
    }
    

    示例...

    这是一个基本示例,它设置了两个面板,一个带有 preferredSize200x200,一个带有 400x400

    当你运行它时,你会发现窗口至少是400x400,并且两个面板的大小相同

    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class Test {
    
        public static void main(String[] args) {
            new Test();
        }
    
        public Test() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                    CardLayout cardLayout = new CardLayout();
                    JPanel base = new JPanel(cardLayout);
                    base.add(makePanel(200, 200, Color.RED), "red");
                    base.add(makePanel(400, 400, Color.BLUE), "blue");
    
                    frame.add(base);
    
                    JButton blue = new JButton("Blue");
                    blue.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            cardLayout.show(base, "blue");
                        }
                    });
                    JButton red = new JButton("red");
                    red.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            cardLayout.show(base, "red");
                        }
                    });
    
                    JPanel buttons = new JPanel();
                    buttons.add(red);
                    buttons.add(blue);
    
                    frame.add(buttons, BorderLayout.SOUTH);
    
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public TestPane makePanel(int width, int height, Color background) {
            TestPane pane = new TestPane(new Dimension(width, height));
            pane.setBackground(background);
            return pane;
        }
    
        public class TestPane extends JPanel {
    
            private JLabel label;
            private Dimension preferredSize;
    
            public TestPane(Dimension size) {
                label = new JLabel("...");
                setLayout(new GridBagLayout());
                add(label);
                this.preferredSize = size;
            }
    
            @Override
            public Dimension getPreferredSize() {
                return preferredSize;
            }
    
            @Override
            public void invalidate() {
                super.invalidate();
                label.setText(getWidth() + "x" + getHeight());
            }
    
        }
    
    }
    

    【讨论】:

    • 它似乎没有改变任何东西。幸运的是,它可以编译,但帧大小没有改变。
    • 根据示例,框架的大小应设置为包裹组件,该组件的大小应为 200x200 - 附加组件将影响框架的最终尺寸,允许最大宽度/高度 (基于他们的首选尺寸)管理的所有组件 - 框架不会改变每个视图的大小,我会避免这样做,因为它很烦人
    • 我做了你的代码,实际的框架是不可见的。我添加了,但框架从未显示。我是不是执行不正确?
    • 导入 java.awt.*;导入 java.awt.event.*;导入 javax.swing.*;导入 javax.swing.event.*;公共类 GameManager { JFrame 框架; JPanel 卡片、TitleScreen、EventsScreen、Running;公共 GameManager() { 卡片 = 新 JPanel(新 CardLayout()); TitleScreen 标题 = 新 TitleScreen();卡片。添加(标题,“标题”); EventsScreen 事件 = 新的 EventsScreen();卡片。添加(事件,“事件”);运行 run = new Running();卡片。添加(运行,“运行”); } public static void main(String [] args) { GameManager gm = new GameManager(); gm.run(); }
    • public void run() { frame = new JFrame("希腊奥运会"); //frame.setSize(1000,750);框架.pack(); frame.setLocation(0,0); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //frame.getContentPane().add(cards); frame.add(卡片); frame.setVisible(true); CardLayout cl = (CardLayout)(cards.getLayout()); cl.show(卡片,“标题”); }
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 2012-07-26
    • 2020-06-21
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 2011-06-29
    • 2014-07-03
    相关资源
    最近更新 更多