2016-11-28 115 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(); 
     } 
    }); 
}