Daniel Thoma: JTable sortieren; Probleme mit leeren Zellen

Beitrag lesen

Hallo Micha,

Dieses Verhalten bei null-Referenzen steht fest in DefaultRowSorter drin.
Ich verstehe ja nicht recht, wieso das so gemacht wurde, schon gar nicht, wieso man es nicht abschalten kann.

DefaultRowSorter setzt allerdings nicht direkt auf dem Modell auf, sondern verwnedet einen ModelWrapper. Dadurch ist es möglich, die Werte, die der RowSorter zum Filtern und Sortieren sieht zu ersetzen, ohne etwas am Datenmodell zu ändern.

Ich würde von TableRowSorter ableiten und dabei setModel wie folgt überschreiben:

  
public static final Object NULL_OBJECT = new Object();  
  
public void setModel(M model) {  
  super.setModel(model);  
  final ModelWrapper<M,Integer> wrapper = getModelWrapper();  
  setModelWrapper(new ModelWrapper<M,Integer> {  
  
        public M getModel() {  
            return wrapper.getModel();  
        }  
  
        public int getColumnCount() {  
            return wrapper.getColumnCount();  
        }  
  
        public int getRowCount() {  
            return wrapper.getRowCount();  
        }  
  
        public Object getValueAt(int row, int column) {  
            Object obj = wrapper.getValueAt(row, column);  
            return obj == null ? NULL_OBJECT : obj;  
        }  
  
        public String getStringValueAt(int row, int column) {  
            return wrapper.getStringValueAt(row, column);  
        }  
  
        public Integer getIdentifier(int index) {  
            return wrapper.getIdentifier(index);  
        }  
    }  
}  

Dann kannst Du einfach statt auf null in deinem Comparator auf NULL_OBJECT vergleichen. Das ist natürlich nicht so richtig sauber, vor allem, weil man sich darauf verlösst, dass setModelWrapper von TableRowSorter nur in setModel aufgerufen wird (was momentan so ist). Eine elegantere Methode scheint es aber nicht zu geben, wenn man nicht gleich einen eigenen RowSorter schreiben will.

Grüße

Daniel