我对 Java 还是很陌生,并且对 JTable(更具体地说是 JXTable)和按列类对混合数据类型对行进行排序有疑问......让我详细说明......
我有一个保存产品列表数据的 JXTable。此表有一个价格列,我已将其设置为 String.class,以便我可以显示带有“$”前缀的价格。
我遇到的问题是,当行按价格排序时,它们没有按双精度排序,而是按字符串排序,因此这些值:
89.85、179.70、299.40、478.80
排序为:
179.70、299.40、478.80、89.85(上升)和 89.85、478.80、299.40、179.70(下降)
我想做的是在排序时删除'$'并将列排序为双精度。我将如何做到这一点?
编辑:
非常感谢 Jiri Patera 的回复。这对帮助我理解 tablecellrenderer 负责在这些类型的情况下操作值很有帮助。下面是完成的摘录,终于完成了我想要的。
public Component getTableCellRendererComponent(JTable pTable, Object pValue, boolean pIsSelected, boolean pHasFocus, int pRow, int pColumn) {
// Use the wrapped renderer
Component renderedComponent = mWrappedRenderer.getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus, pRow, pColumn);
Component renderedComponentHeader = pTable.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus, pRow, pColumn);
if (pColumn == 4 && pValue instanceof Double){
DecimalFormat df = new DecimalFormat("$###,##0.00");
Double d = (Double) pValue;
String s = df.format(d);
renderedComponent = mWrappedRenderer.getTableCellRendererComponent(pTable, s, pIsSelected, pHasFocus, pRow, pColumn);
}
// Set the alignment
Integer alignment = mSpecialColumnAlignmentMap.get(pColumn);
Integer width = mSpecialColumnWidthMap.get(pColumn);
if (alignment != null) {
((JLabel) renderedComponent).setHorizontalAlignment(alignment);
((JLabel) renderedComponentHeader).setHorizontalAlignment(alignment);
} else {
((JLabel) renderedComponent).setHorizontalAlignment(mDefaultAlignment);
((JLabel) renderedComponentHeader).setHorizontalAlignment(mDefaultAlignment);
}
if (width != null){
pTable.getColumnModel().getColumn(pColumn).setPreferredWidth(width);
pTable.getColumnModel().getColumn(pColumn).setMaxWidth(width);
}
return renderedComponent;
}
如您所见,我已经有一个自定义的 tablecellrenderer。我使用 DecimalFormat 来格式化我想要的价格。
希望这对将来的其他人有所帮助。