从Swing元素更新嵌入式JavaFX TableView时堆栈溢出

从Swing元素更新嵌入式JavaFX TableView时堆栈溢出,java,swing,exception,javafx,focus,Java,Swing,Exception,Javafx,Focus,在JavaFX2.2中: 有没有一种方法可以将焦点从嵌入式JavaFX组件干净地转移到Swing组件,反之亦然 目前,我发现将焦点转移到嵌入式JavaFX组件的唯一简单方法是在主机JFXPanel上调用requestFocusInWindow。然后焦点神奇地转移到JavaFX文本区域。问题是,当焦点中的JavaFX项丢失给Swing组件时,会发生堆栈溢出。检查堆栈跟踪显示JavaFXCSS处理无限运行。其中一段: java.lang.StackOverflowError at com.sun.t

在JavaFX2.2中:

有没有一种方法可以将焦点从嵌入式JavaFX组件干净地转移到Swing组件,反之亦然

目前,我发现将焦点转移到嵌入式JavaFX组件的唯一简单方法是在主机JFXPanel上调用requestFocusInWindow。然后焦点神奇地转移到JavaFX文本区域。问题是,当焦点中的JavaFX项丢失给Swing组件时,会发生堆栈溢出。检查堆栈跟踪显示JavaFXCSS处理无限运行。其中一段:

java.lang.StackOverflowError
at com.sun.t2k.LogicalFont.getCanonicalFamilyName(LogicalFont.java:55)
at com.sun.t2k.LogicalFont.getLogicalFont(LogicalFont.java:80)
at com.sun.t2k.T2KFontFactory.createFont(T2KFontFactory.java:338)
at com.sun.javafx.font.PrismFontLoader.font(PrismFontLoader.java:349)
at javafx.scene.text.Font.font(Font.java:143)
at javafx.scene.text.Font.font(Font.java:160)
at com.sun.javafx.css.StyleHelper.lookupFont(StyleHelper.java:2110)
at com.sun.javafx.css.StyleHelper.lookup(StyleHelper.java:1017)
at com.sun.javafx.css.StyleHelper.transitionToState(StyleHelper.java:863)
at javafx.scene.Node.impl_processCSS(Node.java:7418)
at javafx.scene.Parent.impl_processCSS(Parent.java:1146)
at javafx.scene.control.Control.impl_processCSS(Control.java:1154)
at javafx.scene.Node.impl_reapplyCSS(Node.java:7363)
at javafx.scene.control.Labeled$6.invalidated(Labeled.java:323)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:129)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:163)
at com.sun.javafx.css.StyleableObjectProperty.set(StyleableObjectProperty.java:70)
at com.sun.javafx.css.StyleableObjectProperty.applyStyle(StyleableObjectProperty.java:58)
at com.sun.javafx.css.StyleableProperty.set(StyleableProperty.java:70)
at com.sun.javafx.css.StyleHelper.transitionToState(StyleHelper.java:900)
at javafx.scene.Node.impl_processCSS(Node.java:7418)
at javafx.scene.Parent.impl_processCSS(Parent.java:1146)
at javafx.scene.control.Control.impl_processCSS(Control.java:1154)
at javafx.scene.Node.impl_reapplyCSS(Node.java:7363)
at javafx.scene.control.Labeled$6.invalidated(Labeled.java:323)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:129)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:163)
at com.sun.javafx.css.StyleableObjectProperty.set(StyleableObjectProperty.java:70)
at com.sun.javafx.css.StyleableObjectProperty.applyStyle(StyleableObjectProperty.java:58)
at com.sun.javafx.css.StyleableProperty.set(StyleableProperty.java:70)
at com.sun.javafx.css.StyleHelper.transitionToState(StyleHelper.java:900)
at javafx.scene.Node.impl_processCSS(Node.java:7418)
at javafx.scene.Parent.impl_processCSS(Parent.java:1146)
at javafx.scene.control.Control.impl_processCSS(Control.java:1154)
at javafx.scene.Node.impl_reapplyCSS(Node.java:7363)
at javafx.scene.control.Labeled$6.invalidated(Labeled.java:323)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:129)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:163)
at com.sun.javafx.css.StyleableObjectProperty.set(StyleableObjectProperty.java:70)
at com.sun.javafx.css.StyleableObjectProperty.applyStyle(StyleableObjectProperty.java:58)
at com.sun.javafx.css.StyleableProperty.set(StyleableProperty.java:70)
at com.sun.javafx.css.StyleHelper.transitionToState(StyleHelper.java:900)
at javafx.scene.Node.impl_processCSS(Node.java:7418)
at javafx.scene.Parent.impl_processCSS(Parent.java:1146)
at javafx.scene.control.Control.impl_processCSS(Control.java:1154)
at javafx.scene.Node.impl_reapplyCSS(Node.java:7363)
at javafx.scene.control.Labeled$6.invalidated(Labeled.java:323)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:129)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:163)
at com.sun.javafx.css.StyleableObjectProperty.set(StyleableObjectProperty.java:70)
at com.sun.javafx.css.StyleableObjectProperty.applyStyle(StyleableObjectProperty.java:58)
at com.sun.javafx.css.StyleableProperty.set(StyleableProperty.java:70)
at com.sun.javafx.css.StyleHelper.transitionToState(StyleHelper.java:900)
at javafx.scene.Node.impl_processCSS(Node.java:7418)
at javafx.scene.Parent.impl_processCSS(Parent.java:1146)
at javafx.scene.control.Control.impl_processCSS(Control.java:1154)
at javafx.scene.Node.impl_reapplyCSS(Node.java:7363)
at javafx.scene.control.Labeled$6.invalidated(Labeled.java:323)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:129)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:163)
at com.sun.javafx.css.StyleableObjectProperty.set(StyleableObjectProperty.java:70)
at com.sun.javafx.css.StyleableObjectProperty.applyStyle(StyleableObjectProperty.java:58)
at com.sun.javafx.css.StyleableProperty.set(StyleableProperty.java:70)
at com.sun.javafx.css.StyleHelper.transitionToState(StyleHelper.java:900)
at javafx.scene.Node.impl_processCSS(Node.java:7418)
at javafx.scene.Parent.impl_processCSS(Parent.java:1146)
at javafx.scene.control.Control.impl_processCSS(Control.java:1154)
at javafx.scene.Node.impl_reapplyCSS(Node.java:7363)
at javafx.scene.control.Labeled$6.invalidated(Labeled.java:323)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:129)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:163)
at com.sun.javafx.css.StyleableObjectProperty.set(StyleableObjectProperty.java:70)
at com.sun.javafx.css.StyleableObjectProperty.applyStyle(StyleableObjectProperty.java:58)
at com.sun.javafx.css.StyleableProperty.set(StyleableProperty.java:70)
at com.sun.javafx.css.StyleHelper.transitionToState(StyleHelper.java:900)
at javafx.scene.Node.impl_processCSS(Node.java:7418)
at javafx.scene.Parent.impl_processCSS(Parent.java:1146)
at javafx.scene.control.Control.impl_processCSS(Control.java:1154)
at javafx.scene.Node.impl_reapplyCSS(Node.java:7363)
IIRC,关于Swing和JavaFX线程之间的焦点问题,在JIRA有一张罚单,但我希望这里有人知道解决方法

编辑:事实证明这不仅仅是JavaFX和Swing之间的焦点问题,而是它们线程之间的交互问题。回顾我第一次发布这篇文章的时候,它缺乏足够的细节来说明我想做什么

我有一个由Map类型的ObservableList支持的TableView。我希望在Swing组件接收焦点时更改其内容。更新过程通过Platform.runLater正确地推送到JavaFX线程。我让它工作,但它突然开始吐出一堆溢出物


我最近更新了Java7U71,并认为在Swing和JavaFX之间引入了一个关于组件焦点的bug,这导致了这个问题的原始标题将焦点从嵌入式JavaFX转移到Swing。我找到了问题的原因,并在下面发布了答案。

我必须再深入一点才能找到答案,尽管还不足以找到根本原因

我实现了一个定制的TableCell TextFieldTableCell,覆盖updateItem来设置单元格的样式。我发现,即使当backing observeList的更新过程通过Platform.runLater传递给JavaFX线程时,只要表数据发生更改,对updateItem的调用就会导致堆栈溢出。将样式设置传递给JavaFX线程,完成了如下操作:

@Override
public void updateItem(String value, final boolean isEmpty) {
    super.updateItem(value, isEmpty);

    Platform.runLater(new Runnable() {

        @Override
        public void run() {
            if(!isEmpty) {
                    setStyle("-fx-font-weight:bold; -fx-font-size:10");
            }
        }

    });
}

希望这能有所帮助。

其中的片段:此“片段”不包括异常的非常有用的原因!很抱歉,Andrew,正如我提到的,它会无限地继续下去,一次又一次地转储堆栈跟踪。我查看了Eclipse显示的内容,试图寻找根本原因,但恐怕就是这个。应用程序没有崩溃,但是JavaFX控件没有响应。这不是真正的建议,super.updateItem调用或其他观察列表的代码可能会执行一些要求它位于JavaFX应用程序线程上的操作。更好的解决方案是确保您的ObservalElist没有从JavaFX应用程序线程中修改。例如,如果您不在JavaFX应用程序线程中,请使用Platform.runLater调用包围ObservalElist的所有更新。谢谢JewelSea,很抱歉现在才看到这一点。这个组件非常简单,而且纯粹是JFX,尽管它嵌入在JFXPanel中,我认为这就是导致异常的原因。我很小心地按照你所说的做事情,但我认为问题仍然在发生。我发现的唯一方法,至少在JFX2.2中,就是解决这个问题。