【问题标题】:Card Layout with different classes [closed]具有不同类别的卡片布局[关闭]
【发布时间】:2016-07-16 03:48:33
【问题描述】:

我在为我的课程作业制作的小程序方面需要帮助。

我正在使用卡片布局,我希望每张卡片的内容取自不同的类。然后在每张卡片中我想要按钮切换到其他卡片。我见过以类似方式工作的示例,但它们基于 JFrame 而不是小程序。

请不要给我发任何外部链接,我已经研究卡片布局好几天了。我是一名 Java 初学者,而且学习速度很慢。我希望有人向我展示一个基本示例并解释它是如何完成的。谢谢!

public class MainClass extends JApplet implements ActionListener {

        boolean inAnApplet = true;
        JButton btn1, btn2;
        JPanel cards;
        final static String PANEL1 = "";
        final static String PANEL2 = "";


        public MainClass() {

            Container contentPane = getContentPane();
            JPanel cbp = new JPanel();        
            cbp.add(new JLabel ("Hello world!"));

            contentPane.add(cbp, BorderLayout.NORTH);
            cards = new JPanel();
            cards.setLayout(new CardLayout());    


            JPanel p1 = new JPanel();
            p1.add(new JLabel("First panel!"));
            btn1 = new JButton("Text panel");
            btn1.addActionListener(this);
            p1.add(btn1);


            JPanel p2 = new JPanel();
            p2.add(new JLabel("Second panel!"));
            btn2 = new JButton("Button panel");
            btn2.addActionListener(this);
            p2.add(btn2);

            cards.add(p1, PANEL1);
            cards.add(p2, PANEL2);
            contentPane.add(cards, BorderLayout.CENTER);


        }

       public void init(){}

        public void actionPerformed(ActionEvent evt) {

            CardLayout cl = (CardLayout)(cards.getLayout());

                if(evt.getSource() == btn1)
                {
                    cl.show(cards, PANEL1);
                }
                else if(evt.getSource() == btn2)
                {
                    cl.show(cards, PANEL2);
                }   
           }
    }

【问题讨论】:

  • I would like someone to show me a basic example and explain how it is done - 阅读 How to Use CardLayout 上的 Swing 教程中的部分以获取工作演示代码。下载代码并使用它。然后,如果您对教程代码有什么不明白的地方,可以向我们提出具体问题。我们猜不出你不明白什么。例如,在教程中,卡片名称实际上有一个值而不是空字符串。

标签: java swing class applet cardlayout


【解决方案1】:

我给出的代码实际上是从那个教程中摘录的。

那么为什么您的 PANEL1 和 PANEL2 变量没有值?如果您不指定卡的名称,您希望它如何工作???如果您不复制工作代码,您如何期望某些东西可以工作?当您甚至无法遵循教程中的代码时,我们为什么要提供工作代码?为什么您认为我们提供的任何代码都会有所不同?

但我不明白如何使每张卡成为不同的类别。

没有区别。如果要显示卡片,则需要知道要显示的卡片的名称。

现在你使用:

JPanel p1 = new JPanel();
cards.add(p1, PANEL1);

因此,如果面板属于不同的类,则代码为:

JPanel p1 = new SomeCustomPanel()
cards.add(p1, PANEL1);

如果您希望将所有代码放在单独的面板中,则需要从父父面板获取布局管理器,因此每个面板的 ActionListener 中的代码可能类似于:

JPanel parent = childPanel.getParent();
CardLayout layout = (CardLayout)parent.getLayout();

现在您可以访问布局管理器,因此您可以在知道每张卡片名称的情况下切换卡片。如何命名每张卡片以及如何分配卡片名称取决于您。

编辑:

public class SomeCustomPanel extends JPanel
{
    public SomeCustomPanel
    {
        add( new JLabel("I'm a JLabel") );
        JButton button = new JButton("Switch Panel");
        add(button);
        button.addActionListener(...); // add ActionListener to swap cards
    }
}

编辑:

当您将组件添加到面板或将一个面板添加到另一个面板时,我使用这些名称来尝试显示组件之间的父/子关系。

当您使用 ActionListener 时,ActionEvent 的来源将是 JButton。因此,给定生成 ActionEvent 的按钮,您可以返回父/子链,直到找到使用 CardLayout 的面板。

所以你的代码会更像:

JButton button = (JButton)e.getSource();
JPanel someCustomPanel = (JPanel)button.getParent();
JPanel cardLayoutPanel = (JPanel)someCustomPanel.getParent();
CardLayout layout = (CardLayout)cardLayoutPanel.getLayout();
layout.show(cardLayoutPanel, "...");

现在您有了布局管理器,您只需要知道要显示的卡片的名称

【讨论】:

  • 由于我给您的原因,您提供的代码无法正常工作。您创建一个新类。创建类是 Java 101,所以我不确定哪里有混淆。
  • @darijus, but it seems always to pop out with an error. - 我们不是读心术的人。我们不知道您遇到了什么错误。我们不知道您使用的实际代码是什么。我们只能猜测。每当您提出问题时,请以SSCCE 的形式发布您的代码,以便我们准确了解您在做什么。 SSCCE 的重点是简化问题,以确保您准确理解您的要求。请参阅我的编辑,除非包含正确的 SSCCE,否则这将是最后的帮助。
【解决方案2】:

您已将 JPanel 的布局管理器设置为 CardLayout。因此,卡片可以是任何可以添加到 JPanel 的类 - 即任何组件或组件的子类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2015-10-05
    相关资源
    最近更新 更多