java中CardLayout的错误父级

Posted

技术标签:

【中文标题】java中CardLayout的错误父级【英文标题】:wrong parent for CardLayout in java 【发布时间】:2020-06-21 23:36:34 【问题描述】:

我想为组合框中的每个选项更改 CardLayout(包含标签)中的卡片。因此,当我在组合框中选择 Item2 时,它应该显示第二张卡片,但它会返回错误。

在方法 initComponents() 中,我使用 cardLayout.show(imagePanel, "1"); 成功展示了第一张卡片,但是当我尝试在里面做同样的事情时private void comboMenuActionPerformed(),它返回错误“IllegalArgumentException:CardLayout 的父级错误”。为什么会这样?

public class MyFrame extends JFrame 
    public MyFrame() 
        initComponents();
    
    private void initComponents() 
        cardLayout = new java.awt.CardLayout(); 
        mainPanel = new javax.swing.JPanel();
        centerPanel = new javax.swing.JPanel();
        imagePanel = new javax.swing.JPanel(cardLayout);
        comboMenu = new javax.swing.JComboBox<>();
        JLabel firstPicture = new JLabel("");
        JLabel secondPicture = new JLabel("");
        ...

        firstPicture.setIcon(...);
        secondPicture.setIcon(...); 

        imagePanel.add(firstPicture, "1");
        imagePanel.add(secondPicture, "2");
        String[] menu = "Item1", "Item2", "Item3";

        cardLayout.show(imagePanel, "1"); //this works fine

        imagePanel.setLayout(new java.awt.CardLayout());
        centerPanel.add(imagePanel);

        comboMenu.setModel(new javax.swing.DefaultComboBoxModel<>(menu));

        mainPanel.add(centerPanel);
    

    private void comboMenuActionPerformed(java.awt.event.ActionEvent evt)                                            
        if(comboMenu.getSelectedItem().toString().equals("Item2")) 
            cardLayout.show(imagePanel, "2"); //WHY THIS DOESN'T WORK
        
    

    public static void main(String args[]) 
            java.awt.EventQueue.invokeLater(new Runnable() 
                public void run() 
                    new MyFrame().setVisible(true);
                
        );
    
    private javax.swing.JComboBox<String> comboMenu;
    private javax.swing.JPanel centerPanel;
    private javax.swing.JPanel imagePanel;
    private javax.swing.JPanel mainPanel;
    private java.awt.CardLayout cardLayout;

【问题讨论】:

对于未来的问题,请考虑发布minimal reproducible example 【参考方案1】:
    imagePanel = new javax.swing.JPanel(cardLayout);
    ...
    cardLayout.show(imagePanel, "1"); //this works fine
    imagePanel.setLayout(new java.awt.CardLayout());

您将图像面板的布局替换为 CardLayout 的新实例。去掉最后一条语句:

    //imagePanel.setLayout(new java.awt.CardLayout());

【讨论】:

【参考方案2】:

您通过以下方式将卡片布局分配给imagePanel

imagePanel = new javax.swing.JPanel(cardLayout);

然后您通过以下方式分配新的卡片布局:

imagePanel.setLayout(new java.awt.CardLayout());

这会覆盖您添加标签的第一个卡片布局。

【讨论】:

以上是关于java中CardLayout的错误父级的主要内容,如果未能解决你的问题,请参考以下文章

Java中CardLayout的使用

Java中CardLayout布局方式的应用

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

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

Java图形化界面设计——布局管理器之CardLayout(卡片布局)

三十Java图形化界面设计——布局管理器之CardLayout(卡片布局)