неправильный родитель для CardLayout в java - PullRequest
1 голос
/ 10 марта 2020

Я хочу поменять карты в моем 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;
}

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Вы назначаете макет карты на imagePanel с помощью:

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

Но затем вы назначаете новый макет карты с помощью:

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

Это перезаписывает первый макет карты, которому Вы добавили ярлыки.

0 голосов
/ 10 марта 2020
    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());
...