2014-11-30 7 views
1

У меня есть простой JTable с 3 колонками. Числа становятся большими, поэтому я отформатирую их, помещая в них запятые, т. Е. 100 000. Однако при этом сортировка таблицы не работает.JTable - сортировка не работает с отформатированными номерами

Как это исправить?

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); 
    } 
} 

Screenshot of my application

ответ

3

Вы не получите цифровой вид для первого столбца просто потому, что данные строки, а не числовые, я хотел бы предложить вам сохранить ваши данные в виде целого числа,

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)); 
    } 
    }); 
+0

1+ для переопределения 'setVal ue (...) 'метода рендеринга. – camickr

+0

Обратите внимание, что эта процедура может привести к тому, что числа не будут выравниваться справа от ячейки. Чтобы исправить это, просто используйте renderer.setHorizontalAlignment (JLabel.RIGHT). См. [Этот связанный вопрос] (https://stackoverflow.com/questions/3467052/set-right-alignment-in-jtable-column). – Candamir

Смежные вопросы