2016-11-28 114 views
1
package edu.uga.cs1302.gui; 
import java.awt.event.*; 
import java.io.*; 
import java.text.ParseException; 
import java.util.ArrayList; 
import javax.swing.*; 


public class StudentDirectory extends JFrame implements ActionListener{ 

private static final long serialVersionUID = 3294408483853747952L; 
private Student current; 
private ArrayList<Student> data; 
private ArrayList<Student> unsavedData; 
private ObjectOutputStream oos; 
private FileOutputStream fos; 


    public StudentDirectory() throws FileNotFoundException{ 
     JFrame frame = new JFrame("Student Directory"); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    frame.setSize(300,300); 

    data = new ArrayList<Student>(); 
    unsavedData = new ArrayList<Student>(); 
    current = new Student(); 
    unsavedData.add(current); 
    try { 
     fos = new FileOutputStream("StudentsList.dat"); 
     oos = new ObjectOutputStream(fos); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

    JMenuBar mb = new JMenuBar(); 
    JMenu file = new JMenu("File"); 
    JMenuItem load = new JMenuItem("Load"); 
    JMenuItem save = new JMenuItem("Save"); 
    JMenuItem exit = new JMenuItem("Exit"); 

    file.add(load); 
    file.add(save); 
    file.addSeparator(); 
    file.add(exit); 
    mb.add(file); 
    frame.setJMenuBar(mb); 

    JPanel Pane = (JPanel) frame.getContentPane(); 
    GroupLayout layout = new GroupLayout(Pane); 
    Pane.setLayout(layout); 
    layout.setAutoCreateGaps(true); 
    layout.setAutoCreateContainerGaps(true); 

    JLabel ID = new JLabel("ID:"); 
    JTextField IDn = new JTextField(); 
    IDn.setEditable(true); 

    JLabel first = new JLabel("First Name:"); 
    JTextField firstN = new JTextField(); 
    firstN.setEditable(true); 

    JLabel last = new JLabel("Last Name:"); 
    JTextField lastN = new JTextField(); 
    lastN.setEditable(true); 

    JLabel DOB = new JLabel("Date of Birth:"); 
    JTextField dateN = new JTextField(); 
    dateN.setEditable(true); 

    JLabel college = new JLabel("College:"); 
    JTextField collegeN = new JTextField(); 
    collegeN.setEditable(true); 

    JButton prev = new JButton("Previous"); 
    JButton next = new JButton("Next"); 
    JButton append = new JButton("Append"); 

    prev.setEnabled(false); 

    layout.setHorizontalGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) 
       .addComponent(ID) 
       .addComponent(first) 
       .addComponent(last) 
       .addComponent(DOB) 
       .addComponent(college) 
       .addComponent(prev)) 
      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(IDn) 
       .addComponent(firstN) 
       .addComponent(lastN) 
       .addComponent(dateN) 
       .addComponent(collegeN) 
       .addGroup(layout.createSequentialGroup() 
         .addComponent(next) 
         .addComponent(append)) 
       ) 
      ); 

    layout.setVerticalGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
        .addComponent(ID) 
        .addComponent(IDn)) 
      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
        .addComponent(first) 
        .addComponent(firstN)) 
      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
        .addComponent(last) 
        .addComponent(lastN)) 
      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
        .addComponent(DOB) 
        .addComponent(dateN)) 
      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
        .addComponent(college) 
        .addComponent(collegeN)) 
      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
        .addComponent(prev) 
        .addComponent(next) 
        .addComponent(append)) 
     ); 

     exit.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       dispose(); 
       System.exit(0); 
      } 
      } 
     ); 
     load.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       try { 
        fos = new FileOutputStream("StudentsList.dat"); 
        oos.reset(); 
        for(int i = 0; i < data.size();i++){ 
         oos.writeObject(data.get(i)); 
        } 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 

      } 
     }); 

     save.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       try { 
        oos.flush(); 
        oos.close(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 
      } 
     }); 

     IDn.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       int index = unsavedData.indexOf(current); 
       unsavedData.remove(index); 
       String num = IDn.getText(); 
       int idInput = Integer.parseInt(num); 
       current.setID(idInput); 
       unsavedData.add(index, current); 

      } 

     }); 

     firstN.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       int index = unsavedData.indexOf(current); 
       unsavedData.remove(index); 
       String currentFirst = firstN.getText(); 
       current.setFirst(currentFirst); 
       unsavedData.add(index, current); 
      } 
     }); 

     lastN.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       int index = unsavedData.indexOf(current); 
       unsavedData.remove(index); 
       String currentLast = lastN.getText(); 
       current.setLast(currentLast); 
       unsavedData.add(index, current); 
      } 
     }); 

     dateN.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       int index = unsavedData.indexOf(current); 
       unsavedData.remove(index); 
       String currentDOB = dateN.getText(); 
       try { 
        current.setDOB(currentDOB); 
       } catch (ParseException e1) { 
        e1.printStackTrace(); 
       } 
       unsavedData.add(index, current); 
      } 
     }); 

     collegeN.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       int index = unsavedData.indexOf(current); 
       unsavedData.remove(index); 
       String currentCollege = collegeN.getText(); 
       current.setCollege(currentCollege); 
       unsavedData.add(index, current); 
      } 
     }); 

     prev.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       int index = unsavedData.indexOf(current); 
       if(index!=0) 
        if(index-1==0){ 
         prev.setEnabled(false); 
        } 
        current= unsavedData.get(index-1); 
        IDn.cut(); 
        IDn.setText(""+current.getID()); 
        firstN.cut(); 
        firstN.setText(current.getFirst()); 
        lastN.cut(); 
        lastN.setText(current.getLast()); 
        dateN.cut(); 
        dateN.setText(current.getDOB()); 
        collegeN.cut(); 
        collegeN.setText(current.getCollege()); 
      } 

     }); 

     next.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       prev.setEnabled(true); 
       int index = unsavedData.indexOf(current); 
       if(index+1< unsavedData.size()){ 
        current = unsavedData.get(index+1); 
        IDn.cut(); 
        IDn.setText(""+current.getID()); 
        firstN.cut(); 
        firstN.setText(current.getFirst()); 
        lastN.cut(); 
        lastN.setText(current.getLast()); 
        dateN.cut(); 
        dateN.setText(current.getDOB()); 
        collegeN.setText(current.getCollege()); 
       }else{ 
        current = new Student(); 
        IDn.setText(""); 
        firstN.setText(""); 
        lastN.setText(""); 
        dateN.setText(""); 
        collegeN.setText(""); 
        unsavedData.add(current); 
       } 
       index++; 
      } 
     }); 

     append.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       data = new ArrayList<Student>(); 
       for(int x = 0;x<unsavedData.size();x++){ 
        data.add(unsavedData.get(x)); 
       } 
      } 
     }); 



     frame.pack(); 
     frame.setVisible(true); 
     frame.validate(); 


} 
@Override 
public void actionPerformed(ActionEvent e) { 
    // TODO Auto-generated method stub 

} 
} 

主要方法GroupLayout的错误:无法找到错行

package edu.uga.cs1302.gui; 
import java.io.FileNotFoundException; 
import javax.swing.JFrame; 

public class StudentMain { 
    public static void main(String[] args) throws FileNotFoundException{ 
     new StudentDirectory(); 
    } 
} 

当我使用后退按钮我的错误发生。

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: javax.swing.JTextField[,0,0,0x0,invalid,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=0.0,alignmentY=0.0,[email protected],flags=288,maximumSize=,minimumSize=,preferredSize=,caretColor=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0],disabledTextColor=javax.swing.plaf.ColorUIResource[r=128,g=128,b=128],editable=true,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],selectedTextColor=com.apple.laf.AquaImageFactory$SystemColorProxy[r=0,g=0,b=0],selectionColor=com.apple.laf.AquaImageFactory$SystemColorProxy[r=164,g=205,b=255],columns=0,columnWidth=0,command=,horizontalAlignment=LEADING] is not attached to a vertical group 
    at javax.swing.GroupLayout.checkComponents(GroupLayout.java:1090) 
    at javax.swing.GroupLayout.prepare(GroupLayout.java:1040) 
    at javax.swing.GroupLayout.layoutContainer(GroupLayout.java:910) 
    at java.awt.Container.layout(Container.java:1510) 
    at java.awt.Container.doLayout(Container.java:1499) 
    at java.awt.Container.validateTree(Container.java:1695) 
    at java.awt.Container.validateTree(Container.java:1704) 
    at java.awt.Container.validateTree(Container.java:1704) 
    at java.awt.Container.validate(Container.java:1630) 
    at javax.swing.RepaintManager$3.run(RepaintManager.java:711) 
    at javax.swing.RepaintManager$3.run(RepaintManager.java:709) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:708) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1731) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at  java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at java.util.Calendar.setTime(Calendar.java:1770) 
    at java.text.SimpleDateFormat.format(SimpleDateFormat.java:943) 
    at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936) 
    at java.text.DateFormat.format(DateFormat.java:345) 
    at edu.uga.cs1302.gui.Person.getDOB(Person.java:50) 
    at edu.uga.cs1302.gui.StudentDirectory$9.actionPerformed(StudentDirectory.java:234) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6535) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
    at java.awt.Component.processEvent(Component.java:6300) 
    at java.awt.Container.processEvent(Container.java:2236) 
    at java.awt.Component.dispatchEventImpl(Component.java:4891) 
    at java.awt.Container.dispatchEventImpl(Container.java:2294) 
    at java.awt.Component.dispatchEvent(Component.java:4713) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
    at java.awt.Container.dispatchEventImpl(Container.java:2280) 
    at java.awt.Window.dispatchEventImpl(Window.java:2750) 
    at java.awt.Component.dispatchEvent(Component.java:4713) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 
    at java.awt.EventQueue$4.run(EventQueue.java:731) 
    at java.awt.EventQueue$4.run(EventQueue.java:729) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

我的学生类有几个参数(字符串名字,弦乐姓氏,字符串日期,字符串大学,INT ID)

日期转换为日期W¯¯简单的日期格式(MM-DD-YYYY )在构造函数中(可能是其中一个错误)

我的代码点:应该加载一个学生的ArrayList到内存中。应该显示ArrayList的GUI的第一个学生的信息。信息导出到“StudentsList.dat”文件。单击“追加”按钮时保存到文件。 “文件”菜单包含三个菜单项:“加载”,“保存”,“退出”。 “加载”将上述文件中的学生ArrayList加载到内存中。 “保存”将学生的ArrayList保存到上述文件中。 “退出”终止程序。 “上一个”按钮返回到ArrayList中的前一个学生。如果我们在ArrayList的开头,这个按钮应该被禁用。 “Next”按钮显示ArrayList中的后续Student。如果我们在ArrayList的末尾,这个按钮应该被禁用。

+0

的[IllegalStateException异常API](https://docs.oracle.com/javase/8/docs/api/java/lang/IllegalStateException.html)指出,它被称为时*“一方法已在非法或不适当的时间被调用“*。如果这是我的问题,我首先要确保我的GUI是在Swing事件线程上启动的。你做那个?创建一个Runnable并通过'SwingUtilities.invokeLater(...)'将其排入事件线程中? –

+0

hm所以在我的构造函数中使用命令SwingUtilities.invokeLater()?不太清楚你的意思 –

+0

通常上面的静态方法调用是在main方法内或在创建GUI的任何地方完成的。发布你如何创建你的GUI,或许是你的主要方法。 –

回答

0

同样,我的建议是根据Swing文档建议从Swing事件线程中调用GUI。例如:

public static void main(String[] args) { 
    SwingUtilities.invokeLater(() -> { 
     // this is inside a "lambda" Runnable 
     try { 
      new StudentDirectory(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    }); 
}