使用 CardLayout 单击按钮在 jpanels 之间切换 [重复]

Posted

技术标签:

【中文标题】使用 CardLayout 单击按钮在 jpanels 之间切换 [重复]【英文标题】:Switching between jpanels with a click of a button using CardLayout [duplicate] 【发布时间】:2014-09-18 09:26:14 【问题描述】:

我想知道你如何通过按一个按钮转到另一个面板。

我的主界面的代码如下:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
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.JTextField;
import javax.swing.border.LineBorder;

public class MainMenu extends JFrame 

    private JPanel contentPane, confirmPage_Panel;
    private JTextField NumberofSoups_TEXTFIELD;
    private JTextField NumberofSandwiches_TEXTFIELD;
    private JTextField totalCost_TEXTFIELD;
    private JTextField OrderNumber_TEXTFIELD;
    private int Soupclicks = 0;
    private int Sandwichclicks = 0;

    /**
     * Launch the application.
     */
    public static void main(String[] args) 
        EventQueue.invokeLater(new Runnable() 
            public void run() 
                try 
                    MainMenu frame = new MainMenu();
                    frame.setVisible(true);
                 catch (Exception e) 
                    e.printStackTrace();
                
            
        );
    

    /**
     * Create the frame.
     */
    public MainMenu() 
        super("Welcome Yo!");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1268, 716);
        contentPane = new JPanel();
        contentPane.setBackground(Color.DARK_GRAY);
        contentPane.setBorder(new LineBorder(new Color(255, 200, 0), 4, true));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JPanel Header_Panel = new JPanel();
        Header_Panel.setBackground(Color.DARK_GRAY);
        Header_Panel.setBounds(145, 11, 977, 35);
        contentPane.add(Header_Panel);

        JLabel Header_Label = new JLabel("Super Sandwich Store");
        Header_Label.setForeground(Color.PINK);
        Header_Label.setFont(new Font("Tahoma", Font.PLAIN, 22));
        Header_Panel.add(Header_Label);

        JPanel Soup_Panel = new JPanel();
        Soup_Panel.setBackground(Color.PINK);
        Soup_Panel.setBounds(10, 71, 459, 339);
        contentPane.add(Soup_Panel);
        Soup_Panel.setLayout(null);

        JButton Confirm_Button = new JButton("Confirm Now");
        Confirm_Button.setFont(new Font("Tahoma", Font.PLAIN, 14));
        Confirm_Button.setBounds(511, 558, 121, 23);
        contentPane.add(Confirm_Button);

        JButton Exit_Button = new JButton("Exit");
        Exit_Button.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent arg0) 
                System.exit(0);
            
        );
        Exit_Button.setFont(new Font("Tahoma", Font.PLAIN, 13));
        Exit_Button.setBounds(641, 558, 111, 23);
        contentPane.add(Exit_Button);
    // end of MainMenu()


当我点击确认按钮时,它将调用此页面:

public class ConfirmationGUI extends JFrame 

    private JPanel contentPane;
    private JTextField ConfirmedOrder_Field;
    private JTextField totalCost_Field;

    /**
     * Launch the application.
     */
    public static void main(String[] args) 
        EventQueue.invokeLater(new Runnable() 
            public void run() 
                try 
                    ConfirmationGUI frame = new ConfirmationGUI();
                    frame.setVisible(true);
                 catch (Exception e) 
                    e.printStackTrace();
                
            
        );
    

    /**
     * Create the frame.
     */
    public ConfirmationGUI() 
        super("Confirmation Yo!");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 668, 457);
        contentPane = new JPanel();
        contentPane.setBackground(Color.DARK_GRAY);
        contentPane.setBorder(new LineBorder(Color.ORANGE, 4, true));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JPanel Top_Panel = new JPanel();
        Top_Panel.setBackground(Color.DARK_GRAY);
        Top_Panel.setBounds(5, 5, 637, 93);
        contentPane.add(Top_Panel);
        Top_Panel.setLayout(null);

        JLabel lblNewLabel = new JLabel("Super Sandwich Store");
        lblNewLabel.setForeground(Color.PINK);
        lblNewLabel.setBounds(245, 11, 185, 45);
        Top_Panel.add(lblNewLabel);
        lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 18));

    


这将是一个很大的帮助,

谢谢你:)

【问题讨论】:

永远不要使用null布局并仔细阅读Swing tutorial on it。 CardLayout 用于切换组件(如JPanel),而不是top-level containers(如JFrame 或JDialog)。见How to Use CardLayout 也不要使用多个JFrame。创建多个JPanel并在它们之间切换。 那么我该如何使用卡片布局(我已经阅读了给定的链接,但仍然很困惑)。我已经将我的 jframe 转换为 jpanel。 :( 【参考方案1】:

要在 JFrame 之间切换,请为要显示的 JFrame 调用 setVisible(true),为要隐藏的 JFrame 调用 setVisible(false)。 CardLayout 在这里不适用。

建议:阅读Swing布局教程,不要使用绝对定位的空布局,熟悉普通容器和***容器的区别。

【讨论】:

The Use of Multiple JFrames, Good/Bad Practice?(不好的做法)

以上是关于使用 CardLayout 单击按钮在 jpanels 之间切换 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java AWT 图形界面编程LayoutManager 布局管理器 ⑤ ( CardLayout 卡片布局 | ActionListener 按钮点击事件添加 )

无法使用 Sencha Architect 导航 CardLayout

10.4 使用布局管理器3(CardLayout)

java中CardLayout的错误父级

CardLayout 中的 ExtJS 表单

Java中CardLayout的使用