2016-09-20 76 views
0

我需要一些關於JTable的幫助。我試圖從「Contact.txt」文件中讀取數據並使用該數據填充我的表。我可以正確地從文件中獲取數據添加到Object [] []二維數組沒有任何問題。當我嘗試將這個Object數組添加到表不會發生任何事情。 對不起,我的英語不好。JTable不顯示對象[] []數據

Contacts.txt文件包括「姓名」,「姓氏」,「電話號碼」,「電子郵件地址」。

這個類閱讀文本,並將其添加到對象:

public class ReadFromText { 

public boolean ReadTable(Object [][] data) { 

    boolean status = false; 

    File file = new File("/Users/MacbookPro/Documents/Contacts.txt"); 
    BufferedReader bf = null; 
    FileReader fileReader = null; 
    try { 
     fileReader = new FileReader(file); 
     bf = new BufferedReader(fileReader); 

     String textLine = null; 
     String [] text = null; 

     for (int i = 0; i < data.length; i++) { 
      for (int j = 0; j < 4; j++) { 
       while ((textLine = bf.readLine()) != null) { 
        text = textLine.split(" "); 
        data[i][j] = text[j]; 
        status = true; 
        System.out.println(data[i][j]); 
       } 
      } 
     } 
     bf.close(); 

    } catch (IOException e) { 
     System.err.println(e.getMessage()); 
    } 
    return status; 
} 
} 

這從主類部分代碼:

Object [][]datas = new Object[10][4]; 

ReadFromText r = new ReadFromText(); //new object from ReadData class 
    if(r.ReadTable(datas)== true){ 
     System.out.println("OK");//just for to be sure 
    }else{ 
     System.out.println("NO"); 
    } 
    model = new DefaultTableModel(datas, columNames); 
    table = new JTable(model); 
    table.setFont(new Font("Monospaced", Font.PLAIN, 13)); 
    table.setBackground(new Color(245, 245, 245)); 
    table.setRowHeight(25); 
    table.setMinimumSize(new Dimension(60, 20)); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 

它返回 「OK」 從here檢查

但JTable是空的! :看它從this picture

我希望任何人都可以幫助我。 感謝所有

+0

打印數據時會得到什麼? – c0der

+0

@ c0der感謝您的重播,但我試過了..U可以看到第二張圖片的結果 –

回答

1

從代碼中讀取數據的代碼是錯誤的。考慮一下。你使用值0開始外部循環,然後你使用內部循環的值爲0,然後使用while循環讀取整個文件。

您希望您的邏輯讀取一行數據,將該行分割並添加,然後將數據添加到數組中。所以邏輯應該是這樣的:

int row = 0; 

while ((String textLine = bf.readLine()) != null) 
{ 
    String text = textLine.split(" "); 

    for (int i = 0; i < text.length; i++) 
    { 
     data[row][i] = text[i]; 
    } 

    row++ 
} 

但是,你不應該使用數組來保存數據。你不應該硬編碼數據結構的大小,因爲它不允許你添加新的數據。相反,你應該使用Vector來讀取數據。那麼無關緊要的是你有10行數據還是100行。

使用這種方法的代碼會是這樣的:

Vector data = new Vector(); 

while ((String textLine = bf.readLine()) != null) 
{ 
    String text = textLine.split(" "); 
    Vector row = new Vector(); 

    for (int i = 0; i < text.length; i++) 
    { 
     row.addElement(text[i]); 
    } 
} 

所以,你需要改變返回數據的向量的方法。您還需要更改要添加到Vector的「columnNames」,以便可以使用兩個矢量創建TableModel。

+0

發佈另一個問題後被100%檢查,非常感謝。現在它工作,但它只填寫第一列。現在我試圖以正確的方式分割它。 –

+0

@CoderACJHP,'現在它工作,但它只是填充第一列' - 數據數組中的列索引在我的「未經測試」代碼中永遠不會改變。請參閱編輯一種方法來更改列。這是使用矢量的另一個原因,因爲您不必擔心索引。 – camickr

1

我希望這個答案將幫助您找到問題。它也意味着證明發布MCVE的重要性,如下所示:

mport java.awt.Color; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel;

public class TestTable extends JFrame { 

    public TestTable() { 

     super("Main"); 
     setSize(400, 300); 

     Object [][]datas = new Object[][]{ 
      {"A1", "A2","A3","A4"}, 
      {"B1", "B2","B3","B4"} 
     }; 

     Object[] columNames = {"Name","LastName","Phone Num","Email"}; 
     DefaultTableModel model = new DefaultTableModel(datas, columNames); 
     JTable table = new JTable(model); 
     table.setBackground(new Color(245, 245, 245)); 
     table.setRowHeight(25); 
     table.setMinimumSize(new Dimension(60, 20)); 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 

     add(new JScrollPane(table)); 

     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new TestTable(); 
    } 
} 

不僅MCVE可以幫助你更好和更快的響應,在許多情況下,像這樣的,它可以幫助你找到問題所在,並自己解決它。 刪除所有對重現問題不重要的東西,幫助您(以及曾經試圖幫助的人)關注問題出在哪裏。 在這種情況下,您可以看到消除輸入部分,您可以看到JTable正常工作。
enter image description here

+0

謝謝replay.My填充2d數組時出現問題,試圖移動while((text = bf.readLine())!= ){}出2 for循環我得到這樣的結果:[Ljava.lang.String; @ 3ede05c0 –

+0

我知道問題在那裏。這就是爲什麼我發表評論「當你打印數據時你會得到什麼?」 – c0der

+0

我得到正確的數據,所有的事情都可以,但是表格仍然是空的。之後,我們用@ camickr解決了一半的問題:)現在只有第一列填充並需要解決這個問題。可能需要使用不同的正則表達式分割?你有什麼想法嗎? 「只填寫第一欄」THANX –