切换JPanels

4

我正在尝试编写一个基础程序来更好地学习Java,但是我在切换屏幕时遇到了问题。我想要有一个显示类,可以在其他类中调用以处理所有的面板等内容,并制作一个建立每个面板的类。目前我正在尝试使用startmenu类中的按钮,使用display类中的方法从一个面板切换到另一个面板。

下面是在startmenu类中的代码:

public void actionPerformed(ActionEvent e)
{
    display.switchPanel("Start");

}

这是我的显示类:

public class Display 
{
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(); BorderLayout border = new BorderLayout();
public void createDisplay() { frame = new JFrame("插入名称"); frame.setPreferredSize(new Dimension(800,600)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(panel, BorderLayout.CENTER);
panel.setLayout(border); panel.add(startPanel); panel.add(mainPanel);
mainPanel.setVisible(false); startPanel.setVisible(true);
frame.add(panel); frame.pack(); frame.setVisible(true); frame.setResizable(false); }
public void switchPanel(String x) { String p = x;
if(p.equals("开始")) { mainPanel.setVisible(true); startPanel.setVisible(false); }
} }

请查看CardLayout:http://docs.oracle.com/javase/7/docs/api/java/awt/CardLayout.html - ControlAltDel
以你目前的方法,你将会遇到无数问题来对抗 BorderLayout,因为它只能管理 5 个可用位置中的一个组件。相反地,你应该使用 CardLayout,因为这是它的设计初衷。请参阅 如何使用 CardLayout 获取更多详细信息。 - MadProgrammer
我之前使用了CardLayout,在createDisplay方法之前进行了设置。但是当我尝试使用.show时,它一直在startmenu类中调用的方法中给出错误。 - Rwarfield
@MadProgrammer 这是我之前使用卡片布局的代码。' public void switchPanel(String x) { String p = x; if(p.equals("Start")) { card.show(panel, "2"); } }' 'panel.setLayout(card); panel.add(startPanel, "1"); panel.add(mainPanel, "2");' - Rwarfield
1个回答

4
使用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);
}

切换视图

有关详细信息,请参见使用CardLayout


很棒,这帮助我更好地理解如何实现卡片布局!谢谢!我尝试了那个方法,但仍然遇到了相同的错误...也许我添加按钮动作监听器的方式不对?我是这样做的:startBtn.addActionListener(this); 错误是:Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException。 - Rwarfield
那么我假设 displaynull - MadProgrammer
我在startmenu类的开头做了一个私有的Display display;,在另一个类中访问该类的方式是否不正确? - Rwarfield
在这种情况下,您需要引用显示屏实例,该实例实际上显示屏幕上的所有内容。 - MadProgrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接