特定的:Java中的卡布局

时间:2018-12-01 03:33:57

标签: java swing jframe layout-manager cardlayout

我有一个快速的问题,我肯定有一个快速的答案,但请尝试一下,我可能无法弄清楚。

所以我正在编写一个游戏代码,需要在不同的时间显示不同的屏幕。我不知道该怎么做,所以我决定用一个小程序练习。在我的小程序中,我需要三个屏幕:屏幕1有一个打开屏幕2的按钮,屏幕2有一个打开屏幕3和屏幕3的按钮,还有一个打开屏幕1!的按钮:

通过一些研究,我发现可以使用CardLayout做到这一点。在过去的一个小时里,我在互联网上来回走动,这就是我可以想到的:

public class DifferentScreensTester extends JFrame implements ActionListener{

    CardLayout cl = new CardLayout();
    Container contentpane = getContentPane();

    JPanel cards = new JPanel();
    JPanel screen1 = new JPanel();
    JPanel screen2 = new JPanel();
    JPanel screen3 = new JPanel();
    JButton screen1b = new JButton("Go to screen 1");
    JButton screen2b = new JButton("Go to screen 2");
    JButton screen3b = new JButton("Go to screen 3");



    //constrcutor
    public DifferentScreensTester() {
        super();

        contentpane.setLayout (cl);

        //add buttons to respective screens
        screen1.add(screen2b);
        screen2.add(screen3b);
        screen3.add(screen1b);

        //add screens to content pane
        contentpane.add(screen1, "Screen 1");
        contentpane.add("Screen 1", screen1);
        contentpane.add("Screen 2", screen2);
        contentpane.add("Screen 3", screen3);

        //action listeners
        screen1b.addActionListener(this);
        screen2b.addActionListener(this);
        screen3b.addActionListener(this);

    }


    @Override
    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == screen1b) {
            cl.show(screen1, "Screen 1");
        }
        if (event.getSource() == screen2b) {
            cl.show(screen2, "Screen 2");
        }
        if (event.getSource() == screen3b) {
            cl.show(screen3, "Screen 3");
        }

    }




    public static void main(String [] args) {
        //Scanner sc = new Scanner(System.in);

        DifferentScreensTester clmain = new DifferentScreensTester();          
        clmain.setSize(400, 400); 
        clmain.setVisible(true); 
        clmain .setDefaultCloseOperation(EXIT_ON_CLOSE);

    }


}

第一轮顺利进行。屏幕1通过按钮2自动打开。 Here's a picture of what I see. 但是,第二次单击按钮后,我收到了一条冗长的错误消息。这是关于为CardLayout调用错误的父级。

但是在过去的半小时里,我一直在弄弄我的代码,无法解决!我发现示例代码行对我(一个新手而言)太复杂了,甚至无法理解。

如果有人(任何人)可以告诉我这是怎么回事以及如何解决它,将不胜感激。如果您需要任何其他信息,我会提供!谢谢!

1 个答案:

答案 0 :(得分:0)

  

这是关于为CardLayout调用错误的父级。

show(...)方法需要使用CardLayout的面板,而不是要切换到的面板。

请阅读How to Use CardLayout的Swing教程中的部分,以获取简单的工作示例。

您还使用了旧的方法:

contentpane.add("Screen 1", screen1);

上面使用了add(String,Component)方法。阅读Container API。您应该使用add(Component component, Object constraint)版本方法来淘汰此方法:

contentpane.add(screen1, "Screen 1");