切换 JPanel

Posted

技术标签:

【中文标题】切换 JPanel【英文标题】:Switching JPanels 【发布时间】:2016-02-13 06:31:31 【问题描述】:

所以我正在尝试制作一个基本程序来了解有关 java 的更多信息,但我在切换屏幕时遇到了麻烦。我想有一个显示类,我可以在其他类中调用它来处理所有面板等,然后创建一个类来构建每个面板。我目前正在尝试做的是使用我的开始菜单类中的按钮使用显示类中的方法从一个面板更改为另一个面板。

这是startmenu 类中的代码:

public void actionPerformed(ActionEvent e)

    display.switchPanel("Start");


这是我的展示类:

公开课展示 JFrame框架; StartMenu start = new StartMenu(); MainMenu main = new MainMenu(); JPanel 面板 = 新 JPanel(); JPanel startPanel = start.createPanel(); JPanel mainPanel = main.createPanel(); CardLayout card = new CardLayout(); BorderLayout 边框 = new BorderLayout(); 公共无效创建显示() frame = new JFrame("插入名称"); frame.setPreferredSize(新维度(800,600)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(面板, BorderLayout.CENTER); panel.setLayout(边框); panel.add(startPanel); panel.add(mainPanel); mainPanel.setVisible(false); startPanel.setVisible(true); 框架。添加(面板); 框架.pack(); frame.setVisible(true); frame.setResizable(false); 公共无效开关面板(字符串 x) 字符串 p = x; 如果(p.equals(“开始”)) mainPanel.setVisible(true); startPanel.setVisible(false);

【问题讨论】:

查看 CardLayout:docs.oracle.com/javase/7/docs/api/java/awt/CardLayout.html 使用您当前的方法,您将无法解决与BorderLayout 斗争的问题,因为它只会在其 5 个可用位置中的任何一个位置管理单个组件。相反,您应该使用CardLayout,这就是它的设计目的。更多详情请见How to Use CardLayout 我之前使用的是cardlayout,我在createDisplay方法之前设置了它。但是,当我尝试使用 .show 时,它在我在 startmenu 类中调用的方法中一直给我一个错误 @MadProgrammer 这是我之前使用卡片布局的代码。 ' public void switchPanel(String x) String p = x; if(p.equals("开始")) car​​d.show(panel, "2"); ' 'panel.setLayout(card); panel.add(startPanel, "1"); panel.add(mainPanel, "2");' 【参考方案1】:

使用CardLayout,这就是它的设计目的,例如...

public class Display 

    public static final String START_VIEW = "start";
    public static final String MAIN_VIEW = "main";

    JFrame frame;

    StartMenu start = new StartMenu();
    MainMenu main = new MainMenu();

    JPanel panel = new JPanel();

    JPanel startPanel = start.createPanel();
    JPanel mainPanel = main.createPanel();

    CardLayout card = new CardLayout();

    public void createDisplay() 
        frame = new JFrame("Insert Name");
        frame.setPreferredSize(new Dimension(800, 600));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(panel, BorderLayout.CENTER);

        panel.setLayout(card);
        panel.add(startPanel, START_VIEW);
        panel.add(mainPanel, MAIN_VIEW);

        mainPanel.setVisible(false);
        startPanel.setVisible(true);

        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setResizable(false);
    

    public void switchPanel(String x) 
        card.show(panel, x);
    

那么你可能会使用类似...

public void actionPerformed(ActionEvent e)

    display.switchPanel(Display.START_VIEW);

在视图之间切换

详情请见How to Use CardLayout

【讨论】:

酷,这帮助我了解了如何更好地实现卡片布局!谢谢!我试过了,但仍然遇到同样的错误......也许我在按钮上添加了动作监听器错误?我做了这个 startBtn.addActionListener(this);错误是:线程“AWT-EventQueue-0”中的异常 java.lang.NullPointerException 那我假设displaynull 我做了私人Display展示;在 startmenu 类的开头,这是在另一个类中访问该类的不正确方法吗? 在这个是的,你需要引用Display 的实例,它实际上在屏幕上显示所有的东西

以上是关于切换 JPanel的主要内容,如果未能解决你的问题,请参考以下文章

第十二周总结

第十二周

第十二周总结

第十二周课程总结

需要帮助访问内部类中的变量for循环

第十二周课程总结