【问题标题】:JTable - sort not working with formatted numbersJTable - 排序不适用于格式化数字
【发布时间】:2015-01-28 10:28:15
【问题描述】:

我有一个简单的JTable,有 3 列。数字变大了,所以我用逗号来格式化它们,即 100,000。但是,这样做时,我的表格排序不起作用。

我该如何解决这个问题?

package tables;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class mainwindow extends JPanel {

 public static void main(String[] args) {
        Object[][] data = {
            {"75,500", "Don't Let Go", new Integer(179)},
            {"121,343", "Photograph", new Integer(29)},
            {"32,323", "Hash Pipe", new Integer(186)}
        };
        Object[] columns = {"Track #", "Title", "Length"};
        DefaultTableModel model = new DefaultTableModel(data,columns) {
            @Override
            public Class getColumnClass(int column) {
                switch (column) {
                    case 0:
                        return String.class;
                    case 1:
                        return String.class;
                    case 2:
                        return Integer.class;
                    default:
                        return String.class;
                }
            }
        };
        JTable table = new JTable(model);
        JScrollPane scroll = new JScrollPane(table);
        table.setAutoCreateRowSorter(true);
        JOptionPane.showMessageDialog(null, scroll);
    }
}

【问题讨论】:

    标签: java swing sorting jtable integer


    【解决方案1】:

    您不会仅仅因为数据是字符串而不是数字而对第一列进行数字排序,我建议您将数据保留为整数,

       Object[][] data = {
            {75500, "Don't Let Go", new Integer(179)},
            {121343, "Photograph", new Integer(29)},
            {32323, "Hash Pipe", new Integer(186)}
        };
    

    创建并使用您想要的格式的新 cellRender:

      table.setDefaultRenderer(Integer.class, new DefaultTableCellRenderer() {
         private NumberFormat numberFormat = new DecimalFormat("#,###,###");
         @Override
         protected void setValue(Object aValue) {
            Integer value = (Integer) aValue;
            super.setValue(numberFormat.format(value));
         }
      });
    

    【讨论】:

    • 1+ 用于覆盖渲染器的setValue(...) 方法。
    • 请注意,此过程可能会导致数字不再与单元格右侧对齐。要解决此问题,只需使用 renderer.setHorizo​​ntalAlignment(JLabel.RIGHT)。见this related question
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2015-09-25
    • 2010-12-27
    • 2016-12-28
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    相关资源
    最近更新 更多