Java jTable排序百分比值不起作用

时间:2014-12-03 08:45:38

标签: java swing sorting jtable

我想知道为什么我的jTable没有排序百分比值以及如何解决这个问题? 我希望我可以将整行转换为字符串,但仍然无法正常工作。 我究竟做错了什么? 感谢

package tables;
import java.awt.BorderLayout;
import java.text.DecimalFormat;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class mainwindow extends JPanel
{
private static final long serialVersionUID = 1L;
private static Object data[][];
public static void main(String[] args)
{
    DecimalFormat round = new DecimalFormat("#.#");
    JFrame testFrame = new JFrame();
    testFrame.setTitle("table");
    testFrame.setLayout(new BorderLayout());
    data = new Object[30][3];
    String test = null;
    for (int i = 0; i < 30; i ++)
    {
            test = (String) (round.format(100 * new Double((double)  i / 9)))+ "%"; //     dummy values
        data[i][0] = test;
        data[i][1] = "a";
        data[i][2] =  "a";
    }
    Object[] columns =
    {"Track #", "Title", "Length"};
    DefaultTableModel model = new DefaultTableModel(data,columns)
    {
        private static final long serialVersionUID = 1L;

    };
    JTable table = new JTable(model);
    JScrollPane scroll = new JScrollPane(table);
    table.setAutoCreateRowSorter(true);
    testFrame.add(scroll,BorderLayout.CENTER);
    testFrame.pack();
    testFrame.setVisible(true);
}
}

2 个答案:

答案 0 :(得分:1)

调用table.setAutoCreateRowSorter(true)意味着在表模型发生变化时会创建一个RowSorter(它在JavaDoc中!)。由于模型永远不会更改,因此不会创建RowSorter。在table.setModel(model)之后添加对table.setAutoCreateRowSorter(true)的电话。

你需要告诉表格它的数据是Double对象,而不是字符串 - 因为你想像双打一样对它们进行排序,只显示为字符串。

将数组中的数据设置为Double对象:

data[i][0] = new Double(i);

然后编辑表格模型:

DefaultTableModel model = new DefaultTableModel(data, columns) {
    private static final long serialVersionUID = 1L;

    @Override
    public Class getColumnClass(int col) {
        if (col == 0) {
            return Double.class;
        }
        return String.class;
    }

};

现在为第一列实现自定义单元格渲染器:

    JTable table = new JTable(model);
    class PercentRenderer extends javax.swing.table.DefaultTableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable itable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            JLabel oLabel = (JLabel) super.getTableCellRendererComponent(itable, value, isSelected, hasFocus, row, column);
            if (value instanceof Double) {
                oLabel.setText(round.format(100. * (double) value) + "%");
            }
            return oLabel;
        }
    }
    table.getColumnModel().getColumn(0).setCellRenderer(new PercentRenderer());

答案 1 :(得分:1)

不是在String中存储TableModel,而是存储Double。使用custom renderer将值格式化为百分比,如完整example所示。而不是

private NumberFormat nf = NumberFormat.getCurrencyInstance();

使用

private NumberFormat nf = NumberFormat.getPercentInstance();

通过这种方式,您的RowSorter可以依赖Double的自然排序顺序。