Java 如何在将txt加载到JTable时显示空列?
我需要使用Java 如何在将txt加载到JTable时显示空列?,java,swing,file-io,jtable,abstracttablemodel,Java,Swing,File Io,Jtable,Abstracttablemodel,我需要使用分隔符将.txt加载到JTable,我发现了一个很好的示例 以下是示例数据: 102|Beth Reiser||New York|(212)5558725 111|Dylan Ricci||Syracuse|(315)5554486 116|Brian Gugliuzza||Mamaroneck|(914)5553817 120|Gertrude Stein||Elmsford|(914)5553476 131|Daljit Sinnot||Bohemia|(516)5559
分隔符将.txt加载到JTable
,我发现了一个很好的示例
以下是示例数据:
102|Beth Reiser||New York|(212)5558725
111|Dylan Ricci||Syracuse|(315)5554486
116|Brian Gugliuzza||Mamaroneck|(914)5553817
120|Gertrude Stein||Elmsford|(914)5553476
131|Daljit Sinnot||Bohemia|(516)5559811
这是我修改过的代码:
package Model;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;
public class DataFileTableModel extends AbstractTableModel {
protected Vector data;
protected Vector columnNames ;
protected String datafile;
public DataFileTableModel(String f, String delimiter){
datafile = f;
initVectors(delimiter);
}
public void initVectors(String delimiter) {
String aLine ;
data = new Vector();
columnNames = new Vector();
int lineNum=0;
try {
FileInputStream fin = new FileInputStream(datafile);
BufferedReader br = new BufferedReader(new InputStreamReader(fin));
// extract column names
StringTokenizer st1 =
new StringTokenizer(br.readLine(), delimiter);
while(st1.hasMoreTokens())
columnNames.addElement(st1.nextToken());
// extract data
while ((aLine = br.readLine()) != null && lineNum<20) {
StringTokenizer st2 =
new StringTokenizer(aLine, delimiter);
lineNum++;
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 columnNames.size();
}
public String getColumnName(int columnIndex) {
String colName = "";
if (columnIndex <= getColumnCount())
colName = (String)columnNames.elementAt(columnIndex);
return colName;
}
public Class getColumnClass(int columnIndex){
return String.class;
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public Object getValueAt(int rowIndex, int columnIndex) {
return (String)data.elementAt( (rowIndex * getColumnCount()) + columnIndex);
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
return;
}
}
列的大小可能是0px。要查看您的列,为什么不在列中写入空格字符'
?这都是由于您使用了StringTokenizer:您的标记器跳过了空列。首先,您应该简化您的问题——测试StringTokenizer在不使用任何Swing代码的情况下对文本文件的解析,然后在添加任何Swing代码或创建JTable之前尝试修复它
查看使用StringTokenizer与在\\\\\\124;
上拆分测试数据的结果:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class DataFileFoo {
private static final String DATA_FILE_PATH = "datafile.txt";
private static final String DELIMITER = "|";
private static final String SPLIT_REGEX = "\\|";
public static void main(String[] args) {
System.out.println("usingStringTokenizer()");
usingStringTokenizer();
System.out.println();
System.out.println("usingStringSplit();");
usingStringSplit();
}
public static void usingStringTokenizer() {
File datafile = new File(DATA_FILE_PATH);
try {
FileInputStream fin = new FileInputStream(datafile);
BufferedReader br = new BufferedReader(new InputStreamReader(fin));
// extract column names
String aLine = "";
while ((aLine = br.readLine()) != null) {
StringTokenizer st2 = new StringTokenizer(aLine, DELIMITER);
while (st2.hasMoreTokens()) {
System.out.print(st2.nextToken() + ", ");
}
System.out.println();
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void usingStringSplit() {
File datafile = new File(DATA_FILE_PATH);
try {
FileInputStream fin = new FileInputStream(datafile);
BufferedReader br = new BufferedReader(new InputStreamReader(fin));
// extract column names
String aLine = "";
while ((aLine = br.readLine()) != null) {
String[] tokens = aLine.split(SPLIT_REGEX);
for (String token : tokens) {
System.out.print(token + ", ");
}
System.out.println();
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用您的数据文件
102|Beth Reiser||New York|(212)5558725
111|Dylan Ricci||Syracuse|(315)5554486
116|Brian Gugliuzza||Mamaroneck|(914)5553817
120|Gertrude Stein||Elmsford|(914)5553476
131|Daljit Sinnot||Bohemia|(516)5559811
这将返回:
usingStringTokenizer()
102, Beth Reiser, New York, (212)5558725,
111, Dylan Ricci, Syracuse, (315)5554486,
116, Brian Gugliuzza, Mamaroneck, (914)5553817,
120, Gertrude Stein, Elmsford, (914)5553476,
131, Daljit Sinnot, Bohemia, (516)5559811,
usingStringSplit();
102, Beth Reiser, , New York, (212)5558725,
111, Dylan Ricci, , Syracuse, (315)5554486,
116, Brian Gugliuzza, , Mamaroneck, (914)5553817,
120, Gertrude Stein, , Elmsford, (914)5553476,
131, Daljit Sinnot, , Bohemia, (516)5559811,
不要使用StringTokenizer。改用String#split(…)
。即使是StringTokenizer API也会告诉你这一点。是的,当我更改示例数据时,它是有效的。但是,如果用户必须在加载之前先更改数据,这是不可能的。无论如何,回复的thx列的最小大小为10(像素亮度为),但不在默认设置中:如果存在,它将显示与所有其他列相同的宽度。黑客们喜欢仅仅因为找不到真正的问题就写虚拟数据。。。邪恶;-)既然你发表了评论,我就尝试实现String#split()
,但我的错误。。我被分割值卡住了,我只使用“|”
而不使用“\\\\\”
。现在问题解决了,谢谢气垫船先生。如果后面有空值,如何获取?当我试着读数据时,我试着读数据时这样的数据时,我试着读数据时这样的数据时,我试着读数据时这样的数据时,我读数据时这样的数据时,当我读数据时这样的数据时,当我试着读数据时这样的数据时,我试着读数据时这样的数据时,我想这<代码>代码>代码>代码>102>102>102>102>102,贝斯10 10 10 10 10 10 10,纽约纽约,纽约纽约(212)12)55585 5 5 5五五五五五五五五五五五五五五五五五五五五五五五五五五五,纽约,纽约,纽约,纽约,纽约,纽约,纽约,纽约,纽约州(12(12(12)号(12)号(212)5,纽约(212)5)5)55585,纽约(12)55585,纽约(12)5,纽约(12)5,纽约(12)号,纽约(12)号(12)Daljit Sinnot | | | | | | |(516)5559811 | | | | | |
使用拆分,它将显示到第五列try usesplit(String regex,int limit)
,int)?+1,以获得深入问题核心的建议(并实际执行:-),尽管对标记器无法处理它感到惊讶。。应该吗?@Ghost\u 000\u cs如果列数发生动态变化,我如何获得限制
值?
usingStringTokenizer()
102, Beth Reiser, New York, (212)5558725,
111, Dylan Ricci, Syracuse, (315)5554486,
116, Brian Gugliuzza, Mamaroneck, (914)5553817,
120, Gertrude Stein, Elmsford, (914)5553476,
131, Daljit Sinnot, Bohemia, (516)5559811,
usingStringSplit();
102, Beth Reiser, , New York, (212)5558725,
111, Dylan Ricci, , Syracuse, (315)5554486,
116, Brian Gugliuzza, , Mamaroneck, (914)5553817,
120, Gertrude Stein, , Elmsford, (914)5553476,
131, Daljit Sinnot, , Bohemia, (516)5559811,