2014-12-03 3 views
0

Мне было интересно, почему мой jTable не сортирует процентные значения и как я могу это исправить? Я надеялся, что смогу преобразовать всю строку в строку, но это все еще не работает. Что я делаю неправильно? БлагодаряЗначения процентной доли Java 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); 
} 
} 
+1

должно быть работы, начните с/при удалении отливки в строку - (String) (round.format – mKorbel

+0

Что вы имеете в виду, что я должен изменить тест = (String) (round.format (100 * новый Двойной ((двойной) i/9))) + "%"; // фиктивные значения to? – user3176479

ответ

1

Вызывающие table.setAutoCreateRowSorter(true) означает, что RowSorter будет создана, когда модель стола изменяется (это в JavaDoc!). Поскольку модель никогда не изменяется, RowSorter не создается. Позвоните по телефону table.setModel(model) после table.setAutoCreateRowSorter(true).

Вам нужно сообщить в таблицу, что его данные являются объектами 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

Вместо того, чтобы хранить String в вашем TableModel, храните Double. Используйте формат custom renderer для форматирования значения в процентах, как показано в этом example. Вместо

private NumberFormat nf = NumberFormat.getCurrencyInstance(); 

использования

private NumberFormat nf = NumberFormat.getPercentInstance(); 

В этом случае ваш RowSorter может полагаться на естественный порядок сортировки Double.

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