Ошибки pumpEvents cardLayout Java

Я не полностью закончил код, но у меня возникли проблемы после создания графического интерфейса с возможностью переключения карты с одной панели на другую. Я хочу, чтобы вы могли нажать кнопку «Добавить», и вы можете добавить всю информацию для одного ученика и отобразить ее на панели displayAll (этот код еще не написан). Однако я получаю много ошибок, и не знаю, почему.

    import javax.swing.*;

    import java.awt.*;
    import java.util.ArrayList;
    import java.util.Scanner;
    import java.awt.event.*;

    public class Lab12 extends JFrame{
private static final long serialVersionUID = 1L;
Scanner input = new Scanner(System.in);

private JButton add;
private JButton remove;
private JButton sort;
private JButton enterAdd;
private JButton enterRemove;
private JButton enterSort;

public String FirstName;
public String LastName;
public String Major;
public String GPA;
public String UIN;
public String NetID;
public String Age;
public String Gender;

private JLabel FNameLbl;
private JLabel LNameLbl;
private JLabel MajorLbl;
private JLabel GPALbl;
private JLabel UINLbl;
private JLabel NetIDLbl;
private JLabel AgeLbl;
private JLabel GenderLbl;

private JTextField FNameTxt;
private JTextField LNameTxt;
private JTextField MajorTxt;
private JTextField GPATxt;
private JTextField UINTxt;
private JTextField NetIDTxt;
private JTextField AgeTxt;
private JComboBox GenderCmbo;

private JRadioButton Student1;
private JRadioButton Student2;
private JRadioButton Student3;
private JRadioButton Student4;
private JRadioButton Student5;
private JRadioButton Student6;
private JRadioButton Student7;
private JRadioButton Student8;
private JRadioButton Student9;
private JRadioButton Student10;

private JRadioButton FNameRB;
private JRadioButton LNameRB;
private JRadioButton MajorRB;
private JRadioButton GPARB;
private JRadioButton UINRB;
private JRadioButton NetIDRB;
private JRadioButton AgeRB;
private JRadioButton GenderRB;

@SuppressWarnings("rawtypes")
static DefaultListModel listStudents;
private static JList<String>list;

private JPanel combo;
private JPanel selection;
private JPanel addInfo;
private JPanel removeInfo;
private JPanel sortInfo;
private JPanel displayAll;
private JPanel placeHolder;

public static ArrayList <Student> students;

public Lab12(){
    FirstName = " ";
    LastName = " ";
    Major = " ";
    GPA = " ";
    UIN = " ";
    NetID = " ";
    Age = " ";
    Gender = " ";

    String Add = "Add";
    String Remove = "Remove";
    String Sort = "Sort";
    String Display = "Display";
    final ArrayList <Student> students = new ArrayList<Student>(10);

    add = new JButton("Add");
    remove = new JButton("Remove");
    sort = new JButton("Sort");
    enterAdd = new JButton("Enter");
    enterRemove = new JButton("Enter");
    enterSort = new JButton("Enter");

    FNameLbl = new JLabel("First Name: ");
    LNameLbl = new JLabel("Last Name: ");
    MajorLbl = new JLabel("Major: ");
    GPALbl = new JLabel("GPA: ");
    UINLbl = new JLabel("UIN: ");
    NetIDLbl = new JLabel("NetID: ");
    AgeLbl = new JLabel("Age: ");
    GenderLbl = new JLabel("Gender: ");

    FNameTxt = new JTextField();
    LNameTxt = new JTextField();
    MajorTxt = new JTextField();
    GPATxt = new JTextField();
    UINTxt = new JTextField();
    NetIDTxt = new JTextField();
    AgeTxt = new JTextField();
    GenderCmbo = new JComboBox(new String[]{"Male", "Female"});

    Student1 = new JRadioButton();
    Student2 = new JRadioButton();
    Student3 = new JRadioButton();
    Student4 = new JRadioButton();
    Student5 = new JRadioButton();
    Student6 = new JRadioButton();
    Student7 = new JRadioButton();
    Student8 = new JRadioButton();
    Student9 = new JRadioButton();
    Student10 = new JRadioButton();

    FNameRB = new JRadioButton("First Name");
    LNameRB = new JRadioButton("Last Name");
    MajorRB = new JRadioButton("Major");
    GPARB = new JRadioButton("GPA");
    UINRB = new JRadioButton("UIN");
    NetIDRB = new JRadioButton("NetID");
    AgeRB = new JRadioButton("Age");
    GenderRB = new JRadioButton("Gender");

    listStudents = new DefaultListModel();
    list = new JList(listStudents);

    combo = new JPanel(new CardLayout());
    selection = new JPanel();
    addInfo = new JPanel();
    removeInfo = new JPanel();
    sortInfo = new JPanel();
    displayAll = new JPanel();
    placeHolder = new JPanel();

    //create panel for displaying all students- should stay on screen
    displayAll.setLayout(new FlowLayout());
    displayAll.add(list);

    //create panel for adding info for a student
    addInfo.setLayout(new GridLayout(9,2,5,5));
    addInfo.add(FNameLbl);
    addInfo.add(LNameLbl);
    addInfo.add(MajorLbl);
    addInfo.add(GPALbl);
    addInfo.add(UINLbl);
    addInfo.add(NetIDLbl);
    addInfo.add(AgeLbl);
    addInfo.add(GenderLbl);
    addInfo.add(FNameTxt);
    addInfo.add(LNameTxt);
    addInfo.add(MajorTxt);
    addInfo.add(GPATxt);
    addInfo.add(UINTxt);
    addInfo.add(NetIDTxt);
    addInfo.add(AgeTxt);
    addInfo.add(GenderCmbo);
    addInfo.add(enterAdd);

    //create panel for selecting the student to remove
    removeInfo.setLayout(new GridLayout(9,1,5,5));
    removeInfo.add(Student1);
    removeInfo.add(Student2);
    removeInfo.add(Student3);
    removeInfo.add(Student4);
    removeInfo.add(Student5);
    removeInfo.add(Student6);
    removeInfo.add(Student7);
    removeInfo.add(Student8);
    removeInfo.add(Student9);
    removeInfo.add(Student10);
    removeInfo.add(enterRemove);

    //create panel for selecting which property to sort
    sortInfo.setLayout(new GridLayout(9,1,5,5));
    sortInfo.add(FNameRB);
    sortInfo.add(LNameRB);
    sortInfo.add(MajorRB);
    sortInfo.add(GPARB);
    sortInfo.add(UINRB);
    sortInfo.add(NetIDRB);
    sortInfo.add(AgeRB);
    sortInfo.add(GenderRB);
    sortInfo.add(enterSort);

    //create panel for the cardLayout 
    combo.add(displayAll, Display);
    combo.add(addInfo, Add);
    combo.add(removeInfo, Remove);
    combo.add(sortInfo, Sort);

    //create permanent panel for the buttons
    selection.setLayout(new GridLayout(3,1,5,5));
    selection.add(add);
    selection.add(remove);
    selection.add(sort);

    //combine the selection and the shifting combo panel to one panel to add to the whole screen
    placeHolder.setLayout(new FlowLayout());
    placeHolder.add(selection);
    placeHolder.add(combo);

    //add to the main screen
    add(placeHolder);

    //add all event handling below

    //gives action to "add"
     add.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                CardLayout combo = (CardLayout) addInfo.getLayout();
                combo.show(addInfo, "add");
            }
        }
        );

    //this obtains all info for each student
     enterAdd.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                FirstName = FNameTxt.getText();
                LastName = LNameTxt.getText();
                Major = MajorTxt.getText();
                GPA = GPATxt.getText();
                UIN = UINTxt.getText();
                NetID = NetIDTxt.getText();
                Age = AgeTxt.getText();
                Gender = (String) GenderCmbo.getSelectedItem();

                students.add(new Student (FirstName, LastName, Major, GPA, UIN, NetID, Age, Gender));
                (listStudents).addElement(students.get(students.lastIndexOf(students)));
            }
        }
        );


}

public static void display(ArrayList<Student> students){
    for (int n = 0; n < 10; n++) {
        Student Student = students.get(n);
        System.out.println(n + ": " + ((Student)students.get(n)).getFName() + ", " + ((Student)students.get(n)).getLName() + ", " + ((Student)students.get(n)).getMajor() + ", " + ((Student)students.get(n)).getGPA() + ", " + ((Student)students.get(n)).getUIN() + ", " + ((Student)students.get(n)).getNetID() + ", " + ((Student)students.get(n)).getAge() + ", " + ((Student)students.get(n)).getGender());
    }
    System.out.println("");
}
@SuppressWarnings("unchecked")
public static void populateJList(ArrayList<Student> students){
    for(int n = 0; n < 10; n++){
    (listStudents).addElement(students.get(n)); 
    }
}

public static void main(String[] args) {
    Lab12 frame = new Lab12();
    frame.setTitle("Student Database");
    frame.setSize(700,700);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

    }

Ошибки, которые я получаю:

    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.GridLayout cannot be cast to java.awt.CardLayout
at Lab12$1.actionPerformed(Lab12.java:228)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Я пытался использовать их в качестве руководств: http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html Изменение панелей с помощью макета карты

Любая помощь будет оценена по достоинству. В ошибках нет строк, поэтому я понятия не имею, с чего начать. Благодарю вас!


person user2758501    schedule 25.11.2013    source источник


Ответы (1)


Хорошо, я просмотрел ваш код и вижу это:

addInfo.setLayout(new GridLayout(9, 2, 5, 5));

А потом это:

CardLayout combo = (CardLayout) addInfo.getLayout();

Вы применяете макет JPanel к тому, который он не использует.

Итак, эта ошибка говорит сама за себя:

Исключение в потоке "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.GridLayout не может быть приведен к java.awt.CardLayout

Решение: не делайте этого! Не преобразовывайте объект (здесь GridLayout) во что-то, чем он не является (здесь CardLayout). Если вы хотите, чтобы компонент использовал CardLayout, сначала вы должны добавить CardLayout в контейнер.

Урок из всего этого: критически прочитайте сообщение об исключении, поскольку оно часто говорит вам точно, что вы делаете неправильно. В вашем случае это точно так.

person Hovercraft Full Of Eels    schedule 25.11.2013
comment
Спасибо Hovercraft за ответ. Полагаю, я пытался следовать чьему-то примеру, не осознавая, что именно я делаю. Я вернулся и сделал отдельную панель, чтобы поместить каждую из панелей, которые я хотел добавить в cardLayout, и добавил cardLayout в скобках: - person user2758501; 25.11.2013
comment
p1Add = новый JPanel (новый CardLayout()); - person user2758501; 25.11.2013
comment
Затем я изменил combo.add(P1Add, Add); - person user2758501; 25.11.2013
comment
и я изменил комбо CardLayout = (CardLayout) p1Add.getLayout(); - person user2758501; 25.11.2013
comment
Я до сих пор не получил его, чтобы показать, но все ошибки исчезли. Спасибо за помощь! - person user2758501; 25.11.2013
comment
@ user2758501: вы еще не читали учебник по CardLayout. Пожалуйста, сделайте это без промедления. - person Hovercraft Full Of Eels; 25.11.2013