【问题标题】:pumpEvents errors cardLayout JavapumpEvents错误cardLayout Java
【发布时间】:2013-12-09 14:21:51
【问题描述】:

我还没有完全完成代码,但是在创建 GUI 后我遇到了问题,使 cardLayout 能够从一个面板切换到下一个面板。我想要发生的是您可以单击“添加”按钮,您可以添加一个学生的所有信息,并将其显示在 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 Changing Panels using the Card layout

任何帮助将不胜感激。错误没有任何行,所以我不知道从哪里开始。谢谢!

【问题讨论】:

  • “错误没有任何行” 当然有..at Lab12$1.actionPerformed(Lab12.java:228) 为了尽快获得更好的帮助,请发布SSCCE。 (经常编译,问我们有一个编译错误的 20 行代码,而不是有多个错误的 200+ LOC)。

标签: java swing user-interface error-handling cardlayout


【解决方案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 添加到容器中。

从中吸取的教训:批判性地阅读异常消息,因为它通常会准确地告诉你你做错了什么。在你的情况下确实如此。

【讨论】:

  • 感谢气垫船的回复。我想我试图效仿别人的榜样,却没有完全意识到自己在做什么。我回去制作了一个单独的面板,将我想添加的每个面板放入 cardLayout 并在括号中添加了 cardLayout:
  • p1Add = new JPanel(new CardLayout());
  • 然后我改了combo.add(P1Add, Add);
  • 我改变了 CardLayout combo = (CardLayout) p1Add.getLayout();
  • 我还没有让它显示出来,但是所有的错误都消失了。感谢您的帮助!
猜你喜欢
  • 2020-06-21
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多