【问题标题】:JavaFX 8 TreeTableColumn setText ClassCastExceptionJavaFX 8 TreeTableColumn setText ClassCastException
【发布时间】:2014-08-01 12:25:17
【问题描述】:

我的情况是:我有一个TreeTableView 有一个TreeTableColumn。列标题文本将在运行时更改。

当我通过setTexttextProperty().bind(...) 更改文本时在我展示舞台之前一切正常
但是,如果我在展示舞台后更改文本,我会收到大量 java.lang.ClassCastException
我已经使用 Java SE 1.8.0 b132 和 Java 1.8.0_20 b17 EA 进行了尝试。

除了重新创建TreeTableColumn 之外,还有其他解决方法吗?

我的示例代码:

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

异常(点击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

2014 年 8 月 4 日更新:
向 javafx-jira 提交 Bug 报告:
https://bugs.openjdk.java.net/browse/JDK-8095931

更新 08/05/2014:
修复版本为:8u40
@thatjavaguy09 修复确实有效。

你好,Kalsch

【问题讨论】:

    标签: javafx-8 classcastexception settext treetableview


    【解决方案1】:

    查看堆栈跟踪,似乎问题在于您的 TreeTableColumn 正试图被转换为抛出 ClassCastException 的 TableColumn(因为这实际上是一个无效的转换)。

    看来电话来自 TableHeaderRow.invalidated。看看这个方法,我知道演员表是从哪里来的。

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

    这可能是 JDK 的一个错误。我相信正确的演员应该是 TableColumnBase。我会将其提交给他们的错误跟踪器:

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

    【讨论】:

    • 我不知道这是否是正确的答案,但我向 javafx-jira 添加了一个问题。 ;-) 无论如何谢谢。
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 2017-03-10
    • 2019-05-12
    • 2018-10-19
    • 1970-01-01
    • 2014-06-11
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多