Pregunta

Mi situación es la siguiente:Tengo un TreeTableView que tiene un TreeTableColumn.Las Columnas de la cabeza de texto va a ser cambiado en tiempo de ejecución.

Cuando me cambie el texto a través de setText o textProperty().bind(...) antes de mostrar el escenario, todas las obras como expectet.
Pero si puedo cambiar el texto después de mostrar el escenario, que consigue una enorme java.lang.ClassCastException.
He intentado esto con Java SE 1.8.0 b132 y con Java 1.8.0_20 b17 EA.

Hay una solución para esto, excepto la recreación de las TreeTableColumn?

Mi Código De Ejemplo:

    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();

La Excepción(después de hacer clic en 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

ACTUALIZACIÓN 08/04/2014:
Presentado informe de Error para javafx-jira:
https://bugs.openjdk.java.net/browse/JDK-8095931

ACTUALIZACIÓN 08/05/2014:
Revisión de la Versión será: 8u40
@thatjavaguy09 fix no funciona.

Saludos, Kalsch

¿Fue útil?

Solución

Mirando a través de la traza de la pila, parece que el problema es que su TreeTableColumn está tratando de ser empotrado en un TableColumn que es lo que está tirando de la ClassCastException (ya que es de hecho un emitidos válidos).

Parece que la llamada proviene de TableHeaderRow.invalidado.Mirando este método, veo que el elenco está viniendo.

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));
        }
    }
};

Esto podría ser un error con el JDK.Creo que el correcto reparto debe ser un TableColumnBase.Yo diría que este a su bug tracker:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top