将文件数据读入JTable

时间:2012-12-15 12:50:38

标签: java swing file file-io jtable

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

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);
    }
}

请帮忙!谢谢。

3 个答案:

答案 0 :(得分:6)

您在代码中遇到了什么问题?

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

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

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

答案 1 :(得分:4)

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

JavaDoc说明了 StringTokenizer

  

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

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

我使用以下导入使其正常工作

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

}

答案 2 :(得分:3)

我想通过代码告诉您一个重要的问题。您已在表模型中编写了所有内容。您的表模型类应该只包含表column namescolumn countrow countcolumn classgetValueAt,{{1}所需的模型} 方法。请为UI创建一个单独的类并创建一个表,然后创建一个模型并将模型设置为表。 (如果代码只是SSCCE那么它的好处请分开UI和逻辑。)

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

如果您有特定的理由使用AbstractTableModel,那么罚款。否则使用AbstractTableModel几乎所有必需的方法都已实现。