我想从.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);
}
}
请帮忙!谢谢。
答案 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 names
,column count
,row count
,column class
,getValueAt
,{{1}所需的模型} 方法。请为UI创建一个单独的类并创建一个表,然后创建一个模型并将模型设置为表。 (如果代码只是SSCCE那么它的好处请分开UI和逻辑。)
此代码的问题是,如果实现setValueAt
,则必须实现表的所有必需方法,例如设置列名,设置值,获取值等。您不在此设置列名。
如果您有特定的理由使用AbstractTableModel
,那么罚款。否则使用AbstractTableModel
几乎所有必需的方法都已实现。