문제

내 상황은 다음과 같습니다나는 TreeTableView 그건 TreeTableColumn.열 머리글 텍스트는 런타임 시 변경됩니다.

내가 텍스트를 변경할 때 setText 또는 textProperty().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에 버그 보고서를 제출했습니다.
https://bugs.openjdk.java.net/browse/JDK-8095931

업데이트 2014년 8월 5일:
수정 버전은 다음과 같습니다. 8u40
@thatjavaguy09 수정이 작동합니다.

안녕하세요, 칼쉬님

도움이 되었습니까?

해결책

스택 추적을 살펴보면 문제는 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top