如何将JTable列设置为String并排序为Double?

我还是Java的新手,对JTable(更具体地说是JXTable)有问题,并按列类对混合数据类型进行排序……让我详细说明……

我有一个JXTable,用于保存产品列表的数据。 这个表有一个价格列,我只设置为String.class,这样我就可以显示前缀为’$’的价格。

我遇到的问题是当行按价格排序时,它们不是按双打排序,而是按字符串排序,所以这些值:

89.85,179.70,299.40,478.80

分类为:

179.70,299.40,47.80,89.85(升序)和89.85,47.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格式化我想要的价格。

希望这有助于将来的其他人。

HFOE是对的。 但是,对于Java新手来说,这可能很棘手。 请原谅我使用匿名内部类。 请参阅以下示例以获取一些提示……

package test; import java.awt.Component; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; public class TableTest { public static void main(String[] args) { TableTest tt = new TableTest(); tt.start(); } private void start() { JTable t = new JTable(new AbstractTableModel() { private static final long serialVersionUID = 1L; private List values = new ArrayList(); { values.add(Double.valueOf(179.70d)); values.add(Double.valueOf(299.40d)); values.add(Double.valueOf(478.80d)); values.add(Double.valueOf(89.85d)); } @Override public String getColumnName(int column) { return "Double"; } @Override public Class getColumnClass(int column) { return Double.class; } @Override public int getRowCount() { return values.size(); } @Override public int getColumnCount() { return 1; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return values.get(rowIndex); } }); t.setDefaultRenderer(Double.class, new DefaultTableCellRenderer() { private static final long serialVersionUID = 1L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Double d = (Double)value; String s = "$" + String.valueOf(d.doubleValue()); Component c = super.getTableCellRendererComponent(table, s, isSelected, hasFocus, row, column); return c; } }); t.setAutoCreateRowSorter(true); JFrame f = new JFrame(); f.setSize(320, 200); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JScrollPane sp = new JScrollPane(t); f.getContentPane().add(sp); f.setVisible(true); } }
package test; import java.awt.Component; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; public class TableTest { public static void main(String[] args) { TableTest tt = new TableTest(); tt.start(); } private void start() { JTable t = new JTable(new AbstractTableModel() { private static final long serialVersionUID = 1L; private List values = new ArrayList(); { values.add(Double.valueOf(179.70d)); values.add(Double.valueOf(299.40d)); values.add(Double.valueOf(478.80d)); values.add(Double.valueOf(89.85d)); } @Override public String getColumnName(int column) { return "Double"; } @Override public Class getColumnClass(int column) { return Double.class; } @Override public int getRowCount() { return values.size(); } @Override public int getColumnCount() { return 1; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return values.get(rowIndex); } }); t.setDefaultRenderer(Double.class, new DefaultTableCellRenderer() { private static final long serialVersionUID = 1L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Double d = (Double)value; String s = "$" + String.valueOf(d.doubleValue()); Component c = super.getTableCellRendererComponent(table, s, isSelected, hasFocus, row, column); return c; } }); t.setAutoCreateRowSorter(true); JFrame f = new JFrame(); f.setSize(320, 200); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JScrollPane sp = new JScrollPane(t); f.getContentPane().add(sp); f.setVisible(true); } }