事实上,它更像是一个答案,而不是一个问题。 从文件创建JTable时,我遇到了TableRowSorter的问题。我像这样使用TableModel:
public class TModel extends AbstractTableModel {
public Vector data;
public Vector colNames;
public String datafile;
Class[] types = {Integer.class, Date.class, Number.class, String.class, Character.class};
public TModel(String f) {
datafile = f;
initVectors();
}
public void initVectors() {
String aLine;
data = new Vector();
colNames = new Vector();
try {
FileInputStream fin = new FileInputStream(datafile);
BufferedReader br = new BufferedReader(new InputStreamReader(fin));
// extract column names
StringTokenizer st1 =
new StringTokenizer(br.readLine(), "|");
while (st1.hasMoreTokens())
colNames.addElement(st1.nextToken());
// extract data
while ((aLine = br.readLine()) != null) {
StringTokenizer st2 =
new StringTokenizer(aLine, "|");
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 colNames.size();
}
public String getColumnName(int columnIndex) {
String colName = "";
if (columnIndex <= getColumnCount())
colName = (String) colNames.elementAt(columnIndex);
return colName;
}
public Class getColumnClass(int columnIndex) {
return this.types[columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public Object getValueAt(int rowIndex, int columnIndex) {
return data.elementAt((rowIndex * getColumnCount()) + columnIndex);
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
return;
}
问题是表中的第一列按字符串排序,无论它从哪个类型返回&#34; GetColumnClass&#34;方法。针对此类问题的最常见建议是:&#34;您应该覆盖您的GetColumnClass方法&#34;或者&#34;为每一列设置特定类型&#34; ...遗憾的是,这些都不适用于我:_(This topic帮助了我很多,主要是来自Alanmars的片段。 简单的说法:如果TableRowSorter像String一样处理数字,那就让它像Integer一样比较它们! 下面 - 片段,对我有用:
TModel tModel = new TModel(selectedFile);
JTable table = new JTable();
JScrollPane scrollPane = new JScrollPane(table, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sorter = new TableRowSorter<>(tModel);
sorter.setComparator(IndexOfDesiredColumn, new Comparator<String>() {
@Override
public int compare(String n1, String n2) {
return Integer.parseInt(n1) - Integer.parseInt(n2);
}
});
table.setModel(tModel);
table.setRowSorter(sorter);
希望这个步骤能为那些与我面临同样问题的人节省时间。
答案 0 :(得分:-2)
所有列都从原始Vector
获取数据,这些数据都在Object
...
分拣机会接收Object
个null
,而不是toString()
,并在其上调用getColumnClass()
,然后对结果进行排序......
你的NullPointerException
方法没有正确实现,好像模型中没有数据(EG为空)它将抛出 for(var x in [0,1,2]) {console.log('js');}
for(const y in [0,1,2]) {console.log('js');}
......