2012-08-10 19 views
2

我需要的.txt加載到JTabledelimiter,我找到了一個很好的樣本here如何在將txt加載到JTable時顯示空列?

這是樣本數據:

102|Beth Reiser||New York|(212)5558725 
111|Dylan Ricci||Syracuse|(315)5554486 
116|Brian Gugliuzza||Mamaroneck|(914)5553817 
120|Gertrude Stein||Elmsford|(914)5553476 
131|Daljit Sinnot||Bohemia|(516)5559811 

這是我修改後的代碼:

package Model; 

import javax.swing.*; 
import javax.swing.table.*; 
import javax.swing.event.*; 
import java.io.*; 
import java.util.*; 

public class DataFileTableModel extends AbstractTableModel { 

    protected Vector data; 
    protected Vector columnNames ; 
    protected String datafile; 

    public DataFileTableModel(String f, String delimiter){ 
     datafile = f; 
     initVectors(delimiter); 
    } 

    public void initVectors(String delimiter) { 

     String aLine ; 
     data = new Vector(); 
     columnNames = new Vector(); 
     int lineNum=0; 

     try { 
      FileInputStream fin = new FileInputStream(datafile); 
      BufferedReader br = new BufferedReader(new InputStreamReader(fin)); 
      // extract column names 
      StringTokenizer st1 = 
        new StringTokenizer(br.readLine(), delimiter); 
      while(st1.hasMoreTokens()) 
       columnNames.addElement(st1.nextToken()); 
      // extract data 
      while ((aLine = br.readLine()) != null && lineNum<20) { 
       StringTokenizer st2 = 
         new StringTokenizer(aLine, delimiter); 
       lineNum++; 
       while(st2.hasMoreTokens()) 
        data.addElement(st2.nextToken()); 
      } 
      br.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public int getRowCount() { 
     return data.size()/getColumnCount(); 
    } 

    public int getColumnCount(){ 
     return columnNames.size(); 
    } 

    public String getColumnName(int columnIndex) { 
     String colName = ""; 

     if (columnIndex <= getColumnCount()) 
      colName = (String)columnNames.elementAt(columnIndex); 

     return colName; 
    } 

    public Class getColumnClass(int columnIndex){ 
     return String.class; 
    } 

    public boolean isCellEditable(int rowIndex, int columnIndex) { 
     return false; 
    } 

    public Object getValueAt(int rowIndex, int columnIndex) { 
     return (String)data.elementAt((rowIndex * getColumnCount()) + columnIndex); 
    } 

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     return; 
    } 
} 

根據到數據,它會顯示5列,但它只顯示4列,列3因爲空而被跳過。我想顯示所有列到JTable,我怎麼能實現這個?根據@hovercraft-full-of-eels,當空列位於表格中間時,它會成功顯示,但無法處理背面的空列。如何得到這個?

在背面空列中的數據樣本:

102|Beth Reiser||New York|(212)5558725|||| 
111|Dylan Ricci||Syracuse|(315)5554486|||| 
116|Brian Gugliuzza||Mamaroneck|(914)5553817|||| 
+0

唐不使用StringTokenizer。改用'String#split(...)'。即使是StringTokenizer API也會告訴你這一點。 – 2012-08-10 02:51:23

回答

3

這都歸功於您使用StringTokenizer:您的標記器正在跳過純粹且簡單的空列。首先,你應該簡化您的問題 - 測試文本文件的StringTokenizer類的分析,而不任何Swing代碼,然後嘗試修復它之前添加任何Swing代碼或使您的JTable。

\\|退房測試使用的StringTokenizer與分割數據的結果:

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.util.StringTokenizer; 

public class DataFileFoo { 
    private static final String DATA_FILE_PATH = "datafile.txt"; 
    private static final String DELIMITER = "|"; 
    private static final String SPLIT_REGEX = "\\|"; 

    public static void main(String[] args) { 
     System.out.println("usingStringTokenizer()"); 
     usingStringTokenizer(); 

     System.out.println(); 
     System.out.println("usingStringSplit();"); 
     usingStringSplit(); 
    } 

    public static void usingStringTokenizer() { 
     File datafile = new File(DATA_FILE_PATH); 
     try { 
     FileInputStream fin = new FileInputStream(datafile); 
     BufferedReader br = new BufferedReader(new InputStreamReader(fin)); 
     // extract column names 
     String aLine = ""; 
     while ((aLine = br.readLine()) != null) { 
      StringTokenizer st2 = new StringTokenizer(aLine, DELIMITER); 
      while (st2.hasMoreTokens()) { 
       System.out.print(st2.nextToken() + ", "); 
      } 
      System.out.println(); 

     } 
     br.close(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 

    public static void usingStringSplit() { 
     File datafile = new File(DATA_FILE_PATH); 
     try { 
     FileInputStream fin = new FileInputStream(datafile); 
     BufferedReader br = new BufferedReader(new InputStreamReader(fin)); 
     // extract column names 
     String aLine = ""; 
     while ((aLine = br.readLine()) != null) { 
      String[] tokens = aLine.split(SPLIT_REGEX); 
      for (String token : tokens) { 
       System.out.print(token + ", "); 
      } 
      System.out.println(); 

     } 
     br.close(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
} 

使用您的數據文件,

102|Beth Reiser||New York|(212)5558725 
111|Dylan Ricci||Syracuse|(315)5554486 
116|Brian Gugliuzza||Mamaroneck|(914)5553817 
120|Gertrude Stein||Elmsford|(914)5553476 
131|Daljit Sinnot||Bohemia|(516)5559811 

這將返回:

usingStringTokenizer() 
102, Beth Reiser, New York, (212)5558725, 
111, Dylan Ricci, Syracuse, (315)5554486, 
116, Brian Gugliuzza, Mamaroneck, (914)5553817, 
120, Gertrude Stein, Elmsford, (914)5553476, 
131, Daljit Sinnot, Bohemia, (516)5559811, 

usingStringSplit(); 
102, Beth Reiser, , New York, (212)5558725, 
111, Dylan Ricci, , Syracuse, (315)5554486, 
116, Brian Gugliuzza, , Mamaroneck, (914)5553817, 
120, Gertrude Stein, , Elmsford, (914)5553476, 
131, Daljit Sinnot, , Bohemia, (516)5559811, 
+0

既然你發表評論,我嘗試實現'String#split()'但是我的壞..我被困在拆分值,我只用'「|」'而不用'「\\ |」'。現在解決了,感謝Hovercraft先生。 – 2012-08-10 03:49:51

+0

如果返回null值,如何獲取它?當我嘗試讀取這樣的數據時 '102 | Beth Reiser || New York |(212)5558725 |||| 111 | Dylan Ricci || Syracuse |(315)5554486 |||| 116 | Brian Gugliuzza || Mamaroneck |(914)5553817 |||| 120 | Gertrude Stein || Elmsford |(914)5553476 |||| 131 | Daljit Sinnot ||波西米亞|(516)5559811 |||| ' 使用拆分,它顯示,直到第5列 – 2012-08-10 06:26:20

+0

嘗試使用'拆分(字符串正則表達式,int限制)'http://docs.oracle.com/javase/7/docs/api/java/lang/String.html# split(java.lang.String,int)? – 2012-08-10 08:19:06

-1

你列的大小可能是0像素。要查看您的專欄,爲什麼不在您的專欄中寫入空格字符' '

+0

是的,當我更改示例數據,它的工作原理。但是,如果用戶在加載之前必須先更改數據,這是完全不可能的。無論如何thx的答覆 – 2012-08-10 03:10:33

+1

列的最小尺寸是10像素 – mKorbel 2012-08-10 08:07:26

+0

可能是,但不是在默認設置:如果它存在,它將顯示與所有其他寬度相同的寬度。因爲找不到真正的問題就像編寫虛擬數據一樣......黑客;-) – kleopatra 2012-08-10 08:21:29