wtorek, stycznia 05, 2010

Sortujemy JTable gdy się da ;-)

Java jest świetna, Swing bywa świetny, ale czasem jest tak, że niektóre biblioteki z czasem nabierają rumieńców i otrzymają pewne przydatne rzeczy. Czasem jest tak, że użytkownik może żyć bez tych dodatkowych rzeczy, ale gdyby były one dostępne w programie to na pewno nie będzie narzekał ;-)
Jedną z takich rzeczy jest możliwość sortowania w JTable [tego komponentu używam w OOo2GD do wyświetlania listy plików w oknie importu]


Niestety możliwość ta jako standardowa funkcjonalność komponentu pojawiła się dopiero w Java 6, wcześniej by to zrobić trzeba było strasznie kombinować.
Jednak czasem pisząc program musimy celować w starszą wersję Java'y niż najnowsza, tak jest w przypadku OOo2GD, które ze względu na część MacOS'ów korzysta z Java 5... jednak większość użytkowników OOo2GD używa go z Java 6 co więc robić? :-)
Użyć sztuczki! :-)

Cały dowcip polega na tym by na systemach z Java 6 wykonać kod:
jTable1.setAutoCreateRowSorter(true);

Niestety kod OpenOffice.org2GoogleDocs kompilowany jest dla Java 5, a jak już wyżej pisałem JTable w Java 5 nie ma tej metody.

W tym miejscu pojawia się wspomniana sztuczka :-) Polega ona na tym by wywołać tą metodę setAutoCreateRowSorter(boolean) poprzez mechanizm odbić :-)
        if (System.getProperty("java.specification.version").compareTo("1.5")>0) {
try {
Method method = jTable1.getClass().getMethod("setAutoCreateRowSorter", boolean.class);
method.invoke(jTable1, true);
} catch (Exception ex) {
ex.printStackTrace();
}
}

Najpierw upewniamy się, że mamy do czynienia z wersją Java'y wyższą niż 1.5, a następnie szukamy w klasie JTable metody setAutoCreateRowSorter(boolean) by wywołać ją przy użyciu invoke(Object,Class[]) i już wszystko gotowe :-)
Oczywiście ponieważ kod związany z odbiciami może się "nie udać wykonać", bo np. Java kłamie i choć przedstawia się jako coś wyższego od 1.5 to w rzeczywistości nie oferuje odpowiedniej metody, to łapiemy wyjątek i tutaj mamy go prawo całkowicie legalnie zignorować.

Voilà :-) ot cała sztuczka :-)


Podobne postybeta
Refleksje i serializacja w Java'ie - podstawy i obalanie mitów ;-)
Sztuczki tropiciela błędów, part 2 ;-)
Sztuczki tropiciela błędów, part 4
Zinwigiluj się sam ;-)
Potęga lokalności