2017-06-18 111 views
0

我的代碼太大,無法在此處添加。我會爲您提供有關問題的部分。從txt加載JTable數據

frame2.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowOpened(WindowEvent e) { 
      File table_f = new File("C:\\Database\\Table\\Table.txt"); 
      String table_f_path = table_f.getPath(); 
      try { 
      BufferedReader b_reader = new BufferedReader(new FileReader(new File(table_f_path))); 
      BufferedReader reader = new BufferedReader(new FileReader(table_f_path)); 
      int lines = 0; 
      while (reader.readLine() != null) lines++; 
      reader.close(); 
      String table_apo_out; 
      for (int y = 1;y < lines;y++){ 
       table_apo_out = b_reader.readLine(); 
       String[] table_apo_out_array = table_apo_out.split("~"); 
       for (int z=0;z < 20;z++) { 
        System.out.println(Arrays.toString(table_apo_out_array)); 
        System.out.println(y); 
        System.out.println(lines); 
        model_table.setValueAt(table_apo_out_array[z],y,z); 
       } 
      } 
      } catch (IOException qq) { 
       qq.printStackTrace(); 
      } 
     } 
    }); 

這部分嘗試從txt文件加載保存的數據。我也會給你保存在txt文件,這些信息的一部分:

300/50~Δευτέρα 12 Μαΐου 2014~gak~gak~gak~gak~gak~gak~gak~gak~gak~gak~gak~Παρασκευή 5 Μαΐου 2017~524.0~2452.0~gak~2452.0~gak~245245 
300/50~Δευτέρα 12 Μαΐου 2014~gak~gak~gak~gak~gak~gak~gak~gak~gak~gak~gak~Παρασκευή 5 Μαΐου 2017~524.0~2452.0~gak~2452.0~gak~--- 

的數據保存:

frame2.addWindowListener(new WindowAdapter(){ 
     public void windowClosing(WindowEvent e) { 
      File table_f = new File("C:\\Database\\Table\\Table.txt"); 
      int num_row = table.getRowCount(); 
      int num_columns = 21; 
      for (int n = 0;n < num_row; n++){ 
       for(int m = 0;m < num_columns; m++){ 

        FileWriter f_writer = null; 
        BufferedWriter b_writer = null; 
        String table_f_path = table_f.getPath(); 
        try { 
         f_writer = new FileWriter(table_f_path, true); 
         b_writer = new BufferedWriter(f_writer); 
         if (m == 20) { 
          Object com = model_table.getValueAt(n, m); 
          String com_str = com.toString(); 
          b_writer.write(com_str+"\r\n"); 
         } else if (m == 0){ 
          continue; 
         } else { 
          Object data = model_table.getValueAt(n, m); 
          String data_str = data.toString(); 
          b_writer.write(data_str+"~"); 
         } 
        } catch (IOException | NullPointerException | ArrayIndexOutOfBoundsException io){ 
         io.printStackTrace(); 
        } finally { 
         try { 
          if (b_writer != null) 
           b_writer.close(); 
          if (f_writer != null) 
           f_writer.close(); 
          if(n == num_row){ 
           frame2.dispose(); 
          } 
         } catch (IOException ex) { 
          ex.printStackTrace(); 
         } 
        } 
        } 
       } 
     } 
    }); 

我們從JTable中得到的數據是這樣的。現在我面臨一個問題,試圖加載它們!這裏是個例外,我得到:

Exception in thread "AWT-EventQueue-0" 
java.lang.ArrayIndexOutOfBoundsException: 1 >= 0 
at java.util.Vector.elementAt(Vector.java:474) 
at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:664) 
at Test$21.windowOpened(Test.java:2545) 
at java.awt.AWTEventMulticaster.windowOpened(AWTEventMulticaster.java:340) 
at java.awt.Window.processWindowEvent(Window.java:2051) 
at javax.swing.JFrame.processWindowEvent(JFrame.java:305) 
at java.awt.Window.processEvent(Window.java:2013) 
at java.awt.Component.dispatchEventImpl(Component.java:4889) 
at java.awt.Container.dispatchEventImpl(Container.java:2294) 
at java.awt.Window.dispatchEventImpl(Window.java:2746) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
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:80) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) 
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:80) 
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) 

代碼的某些部分是在希臘,對不起

+0

'at Test $ 21.windowOpened(Test.java:2545)' - 2545?重構的時間 –

+1

您會在Q&A'a中找到您的問題重複的完整示例;如果這不是重複的,請編輯您的問題以包含顯示您修改方法的[mcve]。 – trashgod

+1

此問題最初是作爲以下副本而封閉的:https://stackoverflow.com/questions/5554734/what-c​​auses-a-java-lang-arrayindexoutofboundsexception-and-how-do-i-prevent-it。雖然該問題試圖解決「一般」ArrayIndexOutOfBoundsException的原因,但基於花費一些時間來真正查看代碼,OP不理解使用DefaultTableModel的基本知識,因此需要更多信息來解決問題。所以我重新提出了這個問題。 – camickr

回答

2

論壇的所有的點首先是不適合你轉儲堆棧跟蹤好像你不知道這個例外試圖告訴你什麼(這就是爲什麼這個問題最初是關閉的)。

你要做的第一件事就是在論壇上搜索與ArrayIndexOutOfBoundsException有錯誤的其他問題。使用論壇中的信息來解決(縮小)你的問題。

java.lang.ArrayIndexOutOfBoundsException: 1 >= 0 

上面告訴你,你的索引值太大。

at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:664) 

以上提供了更多的信息,告訴你問題時,當您使用setValueAt(..)方法。所以其中一個指標是錯誤的。確定哪個索引是錯誤的是你的工作。

在我看來,問題可能與不瞭解DefaultTableModel如何在內部工作有關。也就是說,當您使用setValueAt(...)方法時,DefaultTableModel不會自動爲您創建存儲。如果數據存儲已由模型分配,則只能使用該方法。

您不會向我們展示您創建DefaultTableModel的位置。所以唯一的假設是你做錯了。

爲您解決問題的最簡單方法是:

  1. 創建只有列名和0行一個DefaultTableModel。閱讀DefaultTableModel API以使用正確的構造函數。

  2. 然後,當您讀取文件中的每行數據時,您將使用DefaultTableModel的addRow(...)添加一行新的數據。

使用上面的建議,不需要兩次讀取文件。您似乎只讀取一次文件來計算行數(但您從不使用「行」變量)。當您使用addRow(...)方法時,TableModel會動態增長

此外,在將代碼保存到文件的代碼中,不需要使用append參數繼續打開文件。該文件應該在任何循環之外打開一次。然後你的邏輯只是向文件添加一行數據。在所有循環結束時,關閉文件一次。