1

我想从 .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);
    }
}

请帮忙!谢谢你。

4

3 回答 3

6

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

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

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

如果您有任何其他问题,请告知使用。我只使用 2 列运行,所以没有完美地测试 getValueAt() 方法。

于 2012-12-15T13:09:33.473 回答
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

}

于 2012-12-15T13:06:07.763 回答
3

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

这段代码的问题是,如果你实现AbstractTableModel你必须为表实现所有必需的方法,比如设置列名、设置值、获取值等。你没有在其中设置列名。

如果您有特定的使用理由,AbstractTableModel那很好。其他使用DefaultTableModel几乎所有需要的方法都实现了。

于 2012-12-15T16:28:16.260 回答