Ahoj,

comparator si muzes napsat svuj, viz. http://download.oracle.com/javase/tutorial/uiswing/components/table.html#sorting
a nastavit do DefaultRowSorter

Nebo to resit i jinak jak tam popisuji v bodech 1.-5. Mozna by stacilo aby ArtworkTypeimplementoval Comparable.

Petr

On 3.8.2011 15:14, Libor Jelinek wrote:
Dobrý den,
při třídění hodnot JXTable (ale přepokládám, že i obyčejná JTable) používá compare(Object, Object) z třídy java.text.Collator. Podle javadocu i zdrojáku v sun-java6-jdk k metodě je vyloženě napsáno, že jen zavolá compare((String) o1, (String) o2):

public int compare(Object o1, Object o2) {
  return compare((String)o1, (String)o2);
}

Kvůli tomuto přetypování ovšem velmi lehce vyhazuje "ClassCastException: <neco> cannot be cast to String". Neměla by spíše používat toString()? Tím by k ničemu nedocházelo. toString() funguje jednoduše vždy.

public int compare(Object o1, Object o2) {
  return compare(o1.toString(), o2.toString());
}


Protože v mém případě JTable pracuje převážně s třídou Object, pak v podstatě dělá JDK toto:

public class CastTest {
    public static void main(String[] args) {
        Object o = new Double("3.14");

        System.out.println((String) o);*// ClassCastException!!!*
    }
}

*Celý stack trace:*
java.lang.ClassCastException: cz.aerocan.reprodb.artworkmodel.ArtworkType cannot be cast to java.lang.String
   at java.text.Collator.compare(Collator.java:310)
   at javax.swing.DefaultRowSorter.compare(DefaultRowSorter.java:951)
   at javax.swing.DefaultRowSorter.access$100(DefaultRowSorter.java:95)
at javax.swing.DefaultRowSorter$Row.compareTo(DefaultRowSorter.java:1359) at javax.swing.DefaultRowSorter$Row.compareTo(DefaultRowSorter.java:1349)
   at java.util.Arrays.mergeSort(Arrays.java:1144)
   at java.util.Arrays.sort(Arrays.java:1079)
at javax.swing.DefaultRowSorter.sortExistingData(DefaultRowSorter.java:536)
   at javax.swing.DefaultRowSorter.setSortKeys(DefaultRowSorter.java:304)
at org.jdesktop.swingx.sort.DefaultSortController.toggleSortOrder(DefaultSortController.java:142) at javax.swing.plaf.basic.BasicTableHeaderUI$MouseInputHandler.mouseClicked(BasicTableHeaderUI.java:96) at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253)
   at java.awt.Component.processMouseEvent(Component.java:6291)
   at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
   at java.awt.Component.processEvent(Component.java:6053)
   at java.awt.Container.processEvent(Container.java:2041)
   at java.awt.Component.dispatchEventImpl(Component.java:4651)
   at java.awt.Container.dispatchEventImpl(Container.java:2099)
   at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4247)
   at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
   at java.awt.Container.dispatchEventImpl(Container.java:2085)
   at java.awt.Window.dispatchEventImpl(Window.java:2478)
   at java.awt.Component.dispatchEvent(Component.java:4481)
   at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
   at java.awt.EventQueue.access$000(EventQueue.java:84)
   at java.awt.EventQueue$1.run(EventQueue.java:602)
   at java.awt.EventQueue$1.run(EventQueue.java:600)
   at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
   at java.awt.EventQueue$2.run(EventQueue.java:616)
   at java.awt.EventQueue$2.run(EventQueue.java:614)
   at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
   at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:148) [catch] at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
   at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Díky
Libor

Odpovedet emailem