Frage

Meine Situation ist:Ich habe ein TreeTableView das hat ein TreeTableColumn.Der Spaltenkopftext wird zur Laufzeit geändert.

Wenn ich den Text durch ändere setText oder textProperty().bind(...) bevor ich die Bühne zeige, alles funktioniert wie erwartet.
Aber wenn ich den Text ändere nach dem Vorführen Auf der Bühne bekomme ich einen riesigen java.lang.ClassCastException.
Ich habe dies mit Java SE 1.8.0 b132 und mit Java 1.8.0_20 b17 EA versucht.

Gibt es eine Problemumgehung dafür, außer die Datei neu zu erstellen? TreeTableColumn?

Mein Beispielcode:

    TreeTableView<String> ttv = new TreeTableView<>();
    TreeTableColumn<String, String> ttc = new TreeTableColumn<>();
    ttc.setText("Hello");
    ttv.getColumns().add(ttc);
    ttv.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent t) {
            ttc.setText("World");
        }
    });

    Scene scene = new Scene(ttv);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();

Die Ausnahme (nach dem Klicken auf TreeTableView):

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:367)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:894)
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56)
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158)
    at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.ClassCastException: javafx.scene.control.TreeTableColumn cannot be cast to javafx.scene.control.TableColumn
    at com.sun.javafx.scene.control.skin.TableHeaderRow$10.invalidated(TableHeaderRow.java:277)
    at javafx.beans.WeakInvalidationListener.invalidated(WeakInvalidationListener.java:83)
    at com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:339)
    at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
    at javafx.beans.property.StringPropertyBase.fireValueChangedEvent(StringPropertyBase.java:103)
    at javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:110)
    at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:143)
    at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:49)
    at javafx.scene.control.TableColumnBase.setText(TableColumnBase.java:189)
    at com.kalasch.test.TreeTableTest.start(TreeTableTest.java:39)
    at com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837)
    at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
    at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
    ... 1 more
Exception running application com.kalasch.test.TreeTableTest

UPDATE 04.08.2014:
Fehlerbericht an javafx-jira gesendet:
https://bugs.openjdk.java.net/browse/JDK-8095931

UPDATE 08.05.2014:
Die Fixversion wird sein: 8u40
@thatjavaguy09 Fix funktioniert.

Grüße, Kalsch

War es hilfreich?

Lösung

Wenn man sich den Stack-Trace ansieht, scheint das Problem darin zu liegen, dass Ihre TreeTableColumn versucht, in eine TableColumn umgewandelt zu werden, was die ClassCastException auslöst (da es sich tatsächlich um eine ungültige Umwandlung handelt).

Es scheint, dass der Aufruf von TableHeaderRow.invalidated kommt.Wenn ich mir diese Methode ansehe, sehe ich, woher die Besetzung kommt.

private final InvalidationListener columnTextListener = new InvalidationListener() {
    @Override public void invalidated(Observable observable) {
        **TableColumn<?,?> column = (TableColumn<?,?>) ((StringProperty)observable).getBean();**
        CheckMenuItem menuItem = columnMenuItems.get(column);
        if (menuItem != null) {
            menuItem.setText(getText(column.getText(), column));
        }
    }
};

Dies könnte ein Fehler im JDK sein.Ich glaube, die richtige Besetzung sollte eine TableColumnBase sein.Ich würde dies an ihren Bug-Tracker senden:

https://javafx-jira.kenai.com/secure/Dashboard.jspa

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top