2013-08-14 3 views
0

У меня есть простой JTable, содержащий целые числа в первом столбце и строки во втором. Я хотел бы иметь возможность сортировать каждую колонку.JTable Renderer не работает с RowSorter?

Мой Renderer:

package gui.table; 

import gui.DaimlerColor; 

import java.awt.Component; 

import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 

@SuppressWarnings("serial") 
public class StandardCellRenderer extends DefaultTableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
      int row, int column) { 

     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     c.setBackground((isSelected ? DaimlerColor.LIGHT_BLUE : (row % 2 == 1 ? DaimlerColor.DARK_WHITE : DaimlerColor.WHITE))); 
     if(isSelected){ 
      c.setBackground(DaimlerColor.LIGHT_BLUE); 
     } 
     return c; 
    } 

}

Мой TableModel:

package gui.table; 

import java.util.List; 
import java.util.Vector; 
import javax.swing.table.DefaultTableModel; 
import org.jdom2.Element; 

import reporting.FailureClassificationCatalogue; 

@SuppressWarnings("serial") 
public class ReportTableModel extends DefaultTableModel { 

    @Override 
    public boolean isCellEditable(int row, int column) { 
     return false; 
    } 

    public ReportTableModel(List<Element> reports) { 

     super(createDataVector(reports), createColumnNames()); 
    } 

    private static Vector<Vector<Object>> createDataVector(List<Element> reports) { 

     Vector<Vector<Object>> data = new Vector<Vector<Object>>(); 
     for (int i = 0; i < reports.size(); i++) { 
      Vector<Object> row = new Vector<Object>(); 
      if(reports.get(i).getName().equals("Default")){ 
       row.add("-"); 
      } 
      else{ 
      row.add(Integer.valueOf(i+1)); 
      } 
      String title = reports.get(i).getAttributeValue("type"); 
      try{ 
       title = FailureClassificationCatalogue.valueOf(title).getName(); 
      }catch(IllegalArgumentException iae){ 

      }catch(NullPointerException npe){ 

      } 
      row.add(title); 
      data.add(row); 
     } 
     return data; 
    } 

    @Override 
    public Class<?> getColumnClass(int colNum) { 
     switch (colNum) { 
      case 0: 
       return Integer.class; 
      case 1: 
       return String.class; 
      default: 
       return String.class; 
     } 
    } 

    private static Vector<String> createColumnNames() { 
     Vector<String> columns = new Vector<String>(); 
     columns.add("Number"); 
     columns.add("Error Type"); 
     return columns; 
    } 

    /** 
    * overridden to ignore null values 
    */ 
    @Override 
    public void setValueAt(Object value, int row, int col) { 
     if (value == null) { 
      return; 
     } 
     // delegate to the parent method 
     super.setValueAt(value, row, col); 
    } 
} 

Если Я не реализовать getColumnClass то рендерер работает отлично, но Целые сортируются как строки. Как только я реализую метод, рендеринг не работает должным образом (фон задается только в одном столбце), но целые числа сортируются правильно. Как я могу это решить?

Мой код, чтобы установить рендерер и сортировщик:

reporttable = new JTable(); 
     reporttable.setName("report"); 
     reporttable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     reporttable.setRowHeight(40); 
     reporttable.addMouseListener(tgc.mouseListener); 
     reporttable.setDefaultRenderer(Object.class, new StandardCellRenderer()); 
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(); 
      reporttable.setRowSorter(sorter); 
      sorter.setModel(reportModel); 

Любые идеи? Благодарю.

ответ

2

Отсутствует sscce, два несколько вещей выделяются:

  1. Вызов setDefaultRenderer() должен указать тип данных, к которому он относится, например, String.class или Integer.class. Альтернативно, переопределите таблицу prepareRenderer(), чтобы рассмотреть все ячейки, как показано на рисунке here.

    reporttable.setDefaultRenderer(Integer.class, new StandardCellRenderer()); 
    
  2. Ваш TableRowSorter конструктор "Создает TableRowSorter с пустой моделью." Вместо этого передайте свой TableModel конструктору или используйте setAutoCreateRowSorter(true).

    reporttable.setAutoCreateRowSorter(true); 
    
  3. «При использовании сортировщика, всегда помнить, чтобы перевести координаты ячейки,» как обсуждалось here.

+0

где должен быть переписан метод prepareRenderer()? У DefaultCellRenderer этот метод отсутствует. –

+0

@mKorbel правильно; выше. – trashgod

+0

@Hans En несколько раз затрагивает convertXxxToXxx в вопросах здесь, помечен RowSorter/RowFilter (сортировка/фильтрация) для prepareRenderer или TableCellRenderer тоже, – mKorbel

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