JTable problem z sortowaniem dat

0

Używam modelu, gdzie podaję odpowiednie obiekty:

 @Override
	public Object getValueAt(int i, int j) {
		Object o;
		switch (j) {
		case 0:
			o=visits.get(i).getNameVisit(); //string
			break;
		case 1:
			o=visits.get(i).getDate(); //Date
		break;
		default:
			o=null;
			break;
		}
		return o;
	}

Korzystam z ułatwienia sortowania:
tabVisit.setAutoCreateRowSorter(true);

Pierwsza kolumna ze stringami bez problemu się sortuje natomiast druga rzuca wyjątkami, jak próbuję ją sortować:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String
	at java.text.Collator.compare(Unknown Source)
	at javax.swing.DefaultRowSorter.compare(Unknown Source)
	at javax.swing.DefaultRowSorter.access$100(Unknown Source)
	at javax.swing.DefaultRowSorter$Row.compareTo(Unknown Source)
	at javax.swing.DefaultRowSorter$Row.compareTo(Unknown Source)
	at java.util.Arrays.mergeSort(Unknown Source)
	at java.util.Arrays.sort(Unknown Source)
	at javax.swing.DefaultRowSorter.sort(Unknown Source)
	at javax.swing.DefaultRowSorter.setSortKeys(Unknown Source)
	at javax.swing.DefaultRowSorter.toggleSortOrder(Unknown Source)
	at javax.swing.plaf.basic.BasicTableHeaderUI$MouseInputHandler.mouseClicked(Unknown Source)
	at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source) 

Mamy błąd rzutowania: java.util.Date cannot be cast to java.lang.String
Jednak nie rozumiem z jakiego powodu Date nie może być zamieniony do Stringa skoro ma metodę .toString() i wyświetla się w tabeli poprawnie.
Dodatkowo Date implementuje interfejs Comparable, więc z sortowaniem nie powinno być problemu.

Po zamienieniu w modelu kodu na:
o=visits.get(i).getDate().toString();
Oczywiście sortowanie działa, ale sortuje jak Stringa, a wyświetla tak jak wcześniej.

Nie rozumiem dlaczego po podaniu Date nie sortuje się automatycznie tylko wyjątkiem rzuca.

0

Metoda compare u Ciebie czeka na typ String. Oba argumenty próbuje po prostu użyć przez niejawne rzutowanie. Nie ma znaczenia to, że każdy obiekt ma metodę toString ponieważ nie służy ona do konwersji typów tak jak to się dzieje przy rzutowaniu referencji z klasy pochodnej do bazy (lub implementującej do interfejsu). Prawdopodobnie masz namieszane w modelu bo inaczej porównywanie następowałoby po typie Date (użyłoby compare(Date o1, Date o2)), a nie próbowało sobie kombinować typ String dla collatora, który porównuje teksty w unikodzie (w przypadku dat jest to kosztowny zbytek).
Możesz też wyciągnąć z typu Date timestampa, który może pójść w autoboxingu jako Long bo wtedy takie porównanie jest najszybsze i nie ma żadnych uzależnień od formatowania, lokalizacji itp. Liczba sekund od 1970 r. będzie w każdym przypadku porównywalna przez zwykłe szybkie odejmowanie (oczywiście, o ile daty nie będą starsze).

0

Z tym longiem dobrze podpowiedziałeś, ale problemu nie rozwiązało. Wczoraj ponad godzinę szukałem błędu i kombinowałem, dziś znalazłem błąd w 5min.
Nie wypełniłem odpowiednio metody:
public Class<?> getColumnClass(int columnIndex)

1 użytkowników online, w tym zalogowanych: 0, gości: 1