我还是相当新的Java和有关JTable(更具体地说,JXTable)和列数据类型的排序行的问题...让我详细说明...如何将JTable列设置为字符串并按Double排序?
我有一个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(降序)
我想什么做的是去除 '$' 在对列进行分类和排序的时间为双倍。我怎么做到这一点?
编辑:
非常感谢您吉日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格式化我想要的价格。
希望这有助于别人出未来。
不要让列类的字符串,而是一个数字类型。而是让单元格渲染器使用显示“$”符号的NumberFormat/currency实例。 – 2012-04-07 13:03:23