【问题标题】:Read file data into JTable将文件数据读入 JTable
【发布时间】:2012-12-15 12:50:37
【问题描述】:

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

请帮忙!谢谢。

【问题讨论】:

标签: java swing file file-io jtable


【解决方案1】:

您的代码遇到了什么问题?

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

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

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

【讨论】:

    【解决方案2】:

    好吧,我只是拿了你的代码并编译它,它工作得很好。 只需确保您进行了正确的导入并且输入文件在您的路径中。 即(“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 namescolumn countrow countcolumn classgetValueAtsetValueAt 方法。请为 UI 创建一个单独的类并创建一个表,然后创建一个模型并将模型设置为表。 (如果代码只是SSCCE,那么它很好,请将UI和逻辑分开。)

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        相关资源
        最近更新 更多