Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建不同GUI显示对象并使用CardLayout在它们之间切换的最佳方法是什么?(爪哇)_Java_Swing_User Interface_Jpanel_Cardlayout - Fatal编程技术网

Java 创建不同GUI显示对象并使用CardLayout在它们之间切换的最佳方法是什么?(爪哇)

Java 创建不同GUI显示对象并使用CardLayout在它们之间切换的最佳方法是什么?(爪哇),java,swing,user-interface,jpanel,cardlayout,Java,Swing,User Interface,Jpanel,Cardlayout,我想创建一个相当简单的GUI程序,根据用户单击的按钮在面板之间切换。我四处搜索,发现卡片布局是最好的建议 基本上,在CardLayout的示例中,您创建一张“卡”(JPanel),然后添加每个组件,如按钮等。。。然后在卡片之间切换 我要创建的是一个对象,它是一张“卡片”,所有组件都已经在一个单独的类中设置好了,只需在主程序中创建一个实例。我是一个初学者,不知道最佳设计实践,所以我不想创建自己的类来扩展JPanel,我很确定这是一个糟糕的设计 您可以像创建JPanel的实例并将组件直接添加到其中一

我想创建一个相当简单的GUI程序,根据用户单击的按钮在面板之间切换。我四处搜索,发现卡片布局是最好的建议

基本上,在CardLayout的示例中,您创建一张“卡”(JPanel),然后添加每个组件,如按钮等。。。然后在卡片之间切换


我要创建的是一个对象,它是一张“卡片”,所有组件都已经在一个单独的类中设置好了,只需在主程序中创建一个实例。我是一个初学者,不知道最佳设计实践,所以我不想创建自己的类来扩展JPanel,我很确定这是一个糟糕的设计

您可以像创建
JPanel
的实例并将组件直接添加到其中一样执行此操作

您需要确保自定义类从
JComponent
JPanel
(最好)扩展,并像任何其他组件一样将它们添加到容器中,例如

import java.awt.BorderLayout;
import java.awt.CardLayout;
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.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestCard {

    public static void main(String[] args) {
        new TestCard();
    }

    public TestCard() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                final CardLayout cardLayout = new CardLayout();
                final JPanel cardPane = new JPanel(cardLayout);
                cardPane.add(new Card01(), "Card01");
                cardPane.add(new Card02(), "Card02");

                JToggleButton btnCard01 = new JToggleButton("#1");
                JToggleButton btnCard02 = new JToggleButton("#2");
                ButtonGroup bg = new ButtonGroup();
                bg.add(btnCard01);
                bg.add(btnCard02);
                JPanel buttons = new JPanel();
                buttons.add(btnCard01);
                buttons.add(btnCard02);

                btnCard01.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        cardLayout.show(cardPane, "Card01");
                    }
                });
                btnCard02.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        cardLayout.show(cardPane, "Card02");
                    }
                });
                btnCard01.setSelected(true);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(cardPane);
                frame.add(buttons, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class Card01 extends JPanel {

        public Card01() {
            setLayout(new GridBagLayout());
            add(new JLabel("#1"));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }

    public class Card02 extends JPanel {

        public Card02() {
            setLayout(new GridBagLayout());
            add(new JLabel("#2"));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }

}

这个“卡片”是从
JComponent
扩展而来的吗?很酷,我对这个很陌生,为什么要将btnCard01设置为true,我看不到它被使用,我的代码在没有它的情况下运行。另外,对“卡片”使用内部类还是单独的类文件更好?因为
btnCard01
是一个
JToggleButton
,我希望按钮与当前屏幕匹配。