2012-12-15 73 views
1

我想从.txt文件读取数据并将它们发送到我的表格。 我该怎么办? 我的代码:将文件数据读入到JTable中

public class InsertFileDataToJTable extends AbstractTableModel { 
    Vector data; 
    Vector columns; 

    public InsertFileDataToJTable() { 
      String line; 
      data = new Vector(); 
      columns = new Vector(); 
      try { 
        FileInputStream fis = new FileInputStream("student.txt"); 
        BufferedReader br = new BufferedReader(new InputStreamReader(fis)); 
        StringTokenizer st1 = new StringTokenizer(br.readLine(), " "); 
        while (st1.hasMoreTokens()) 
          columns.addElement(st1.nextToken()); 
        while ((line = br.readLine()) != null) { 
          StringTokenizer st2 = new StringTokenizer(line, " "); 
          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 columns.size(); 
    } 

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

    public static void main(String s[]) { 
      InsertFileDataToJTable model = new InsertFileDataToJTable(); 
      JTable table = new JTable(); 
      table.setModel(model); 
      JScrollPane scrollpane = new JScrollPane(table); 
      JPanel panel = new JPanel(); 
      panel.add(scrollpane); 
      JFrame frame = new JFrame(); 
      frame.add(panel, "Center"); 
      frame.pack(); 
      frame.setVisible(true); 
    } 
} 

请大家帮忙!谢谢。

+2

*我该怎么做?*:向我们解释问题所在,并阅读[本教程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html) –

+2

切线:另见[*初始线程*](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

回答

6

你在代码中获得什么问题?

我运行你的代码,它工作完美,除了列名将默认为A,B,...因为你没有从模型中检索列名的方法。你已经实现了方法getValueAt(),并且完美地工作。只需在上面的类中添加列名的新方法:

public String getColumnName(int i){ 
    return (String)columns.get(i); 
} 

如果您有任何其他问题,请让我们知道。我只运行了2列,所以没有完全测试getValueAt()方法。

+0

是的,根据亚伯拉罕,你必须输入必要的课程。 – UDPLover

4

嗯,我只是把你的代码和编译它,它工作得很好。 只要确保您正在进行正确的导入并且输入文件在您的路径中。 即(“student.txt”应与java文件位于同一文件夹中)。

的JavaDoc的说,这大约的StringTokenizer

标记生成器使用默认的分隔符集,这是 “\ t \ n \ r \ F”:空格字符,制表符,换行符,回车符和换页符。

因此,请确保输入文件中的字段正在使用这些字段,因为您使用的是默认分隔符。

我用下面的进口,使其工作

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


public class InsertFileDataToJTable extends AbstractTableModel { 
// the rest of the code is same as yours 

}

3

我想通过代码告诉您一个重要的问题。你已经在表格模型中写下了所有内容。您的表格模型类应只包含表格所需的模型,如column names,column count,row count,column class,getValueAt,setValueAt方法。请为UI创建一个单独的类并创建一个表,然后创建一个模型并将模型设置到表中。 (如果代码只是SSCCE那么它的良好否则请分开的UI和逻辑。)

这段代码的问题是,如果你实现AbstractTableModel你必须实现,如设置列名称表的所有所需的方法,设置值,获取值等。您不在此设置列名称。

如果您有特定的理由使用AbstractTableModel那么它很好。否则使用DefaultTableModel几乎所有必需的方法都被执行。