Я не понимаю, почему я получаю исключение IllegalArgumentException: неправильный родитель для CardLayout

Это класс CardTesting, где я получаю исключение IllegalArgumentException: неправильный родитель для CardLayout. Строка cl.show(this, "Panel 2") вызывает исключение IllegalArgumentException: неверный родитель для CardLayout. Пожалуйста помоги! :D

import java.awt.*;
import javax.swing.*;

public class CardTesting extends JFrame {

CardLayout cl = new CardLayout();
JPanel panel1, panel2;

public CardTesting() {
    super("Card Layout Testing");
    setSize(400, 200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(cl);
    panel1 = new JPanel();
    panel2 = new JPanel();
    panel1.add(new JButton("Button 1"));
    panel2.add(new JButton("Button 2"));
    add(panel1, "Panel 1");
    add(panel2, "Panel 2");

    setVisible(true);
}

private void iterate() {
    try {
        Thread.sleep(1000);
    } catch (Exception e) { }
    cl.show(this, "Panel 2");
}

public static void main(String[] args) {
    CardTesting frame = new CardTesting();
    frame.iterate();
}

}


person andy    schedule 21.06.2015    source источник
comment
Не могли бы вы прикрепить трассировку стека?   -  person AlexR    schedule 21.06.2015
comment
Это ваша проблема, связанная с этим? stackoverflow.com/questions/12290609/   -  person alessiop86    schedule 21.06.2015


Ответы (1)


Вы получаете IllegalArguementException, потому что вы используете this при показе карточек cl.show(this, "Panel 2");, где this относится к JFrame родителю, и вы не добавили никакого макета для родительского JFrame. Всегда лучше заключать карточки в JPanel а не JFrame

Вы должны добавить две карты/панели к родительской панели и назначить макет как cardLayout. Здесь я создал cardPanel как родительский.

import java.awt.*;
import javax.swing.*;

public class CardTesting extends JFrame {

    CardLayout cl = new CardLayout();

    JPanel panel1, panel2;
    JPanel cardPanel;
    public CardTesting() {
        super("Card Layout Testing");
        setSize(400, 200);
        this.setLayout(cl);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(cl);
        panel1 = new JPanel();
        panel2 = new JPanel();
        cardPanel=new JPanel();
        cardPanel.setLayout(cl);
        panel1.add(new JButton("Button 1"));
        panel2.add(new JButton("Button 2"));
        cardPanel.add(panel1, "Panel 1");
        cardPanel.add(panel2, "Panel 2");
        add(cardPanel);
        setVisible(true);
    }

    private void iterate() {
        /* the iterate() method is supposed to show the second card after Thread.sleep(1000), but cl.show(this, "Panel 2") throws an IllegalArgumentException: wrong parent for CardLayout*/
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
        }
        cl.show(cardPanel, "Panel 2");
    }

    public static void main(String[] args) {
        CardTesting frame = new CardTesting();
        frame.iterate();
    }
}
person Madhan    schedule 21.06.2015
comment
Большое спасибо за ваш ответ, и я понимаю, почему лучше использовать панель в качестве контейнера для карточек. Но я до сих пор не понимаю, почему это не работает с JFrame, поскольку я вызвал его метод setLayout(cl). - person andy; 21.06.2015