سؤال

وضعي هو:لدي TreeTableView التي لديها TreeTableColumn.سيتم تغيير نص رأس الأعمدة في وقت التشغيل.

عندما أقوم بتغيير النص من خلال setText أو textProperty().bind(...) قبل أن تظهر المرحلة, جميع الأعمال كما هو متوقع.
ولكن إذا قمت بتغيير النص بعد عرض المرحلة ، أحصل على ضخمة java.lang.ClassCastException.
لقد حاولت هذا مع جافا سي 1.8.0 ب 132 ومع جافا 1.8.0_20 ب 17 إي.

هل هناك حل بديل لهذا باستثناء إعادة إنشاء 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

تحديث 08/04/2014:
تقرير علة المقدمة إلى جافافس-جيرا:
https://bugs.openjdk.java.net/browse/JDK-8095931

تحديث 08/05/2014:
إصلاح الإصدار سيكون: 8 يو 40
تضمين التغريدة إصلاح 09 يعمل.

تحياتي ، كالش

هل كانت مفيدة؟

المحلول

تبحث من خلال تتبع المكدس ، يبدو أن المشكلة هي أن تريتابليكولومن الخاص بك يحاول أن يكون مسبوكا في تابلكولومن وهو ما رمي كلاسكاستكسيبتيون (لأن هذا هو في الواقع يلقي غير صالح).

يبدو أن المكالمة قادمة من تابليهيديرو.إبطال.بالنظر إلى هذه الطريقة ، أرى من أين يأتي فريق التمثيل.

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

قد يكون هذا خطأ مع جدك.وأعتقد أن يلقي الصحيح يجب أن يكون إلى تابلكولومنباس.وأود أن يقدم هذا إلى تعقب علة بهم:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top