Java toFront()抛出不支持的操作异常

Java toFront()抛出不支持的操作异常,java,javafx,javafx-8,java-8,Java,Javafx,Javafx 8,Java 8,我想创建一个StackPane,其中,无论添加什么,我选择的节点总是在最前面(而不是必须注意我添加内容的顺序,或者在添加任何内容时记住在该特定节点上调用toFront()) 为了做到这一点,我只需在相关的StackPane对象的子列表上放置一个侦听器,这样每当有任何更改时,它都会在相关节点上调用toFront(),例如: public class Test extends Application { @Override public void start(Stage stage

我想创建一个
StackPane
,其中,无论添加什么,我选择的节点总是在最前面(而不是必须注意我添加内容的顺序,或者在添加任何内容时记住在该特定节点上调用
toFront()

为了做到这一点,我只需在相关的
StackPane
对象的子列表上放置一个侦听器,这样每当有任何更改时,它都会在相关节点上调用
toFront()
,例如:

public class Test extends Application {

    @Override
    public void start(Stage stage) {
        StackPane root = new StackPane();
        final Rectangle r1 = new Rectangle(50, 50);
        root.getChildren().add(r1);
        root.getChildren().addListener(new ListChangeListener<Node>() {
            @Override
            public void onChanged(ListChangeListener.Change<? extends Node> change) {
                try {
                    while(change.next()) {
                        if(change.wasAdded()) {
                            r1.toFront();
                        }
                    }
                }
                catch(Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
        root.getChildren().add(new Rectangle(50, 50));

        stage.setScene(new Scene(root));
        stage.show();
    }
}
是的,
test.test$1.onChanged(test.java:34)
确实引用了
r1.toFront()

这是被认为是一个bug,还是我试图通过这种方式来完成事情,从而打破了一些我不知道的规则?我确实想知道在执行
onChanged()
方法时列表是否仍在更改,并且
toFront()
也会更改列表内容,因此出现异常-但是
onChanged()
的Javadoc清楚地说明:

在对可观察列表进行更改后调用

(黑体字是我的。)


编辑:在这一点上,我更确定这是一个错误,因此相关的错误报告是。

似乎不允许您修改当前正在处理同一列表的另一个(以前)修改事件的事件处理程序中的(JavaFX)列表。虽然这似乎是合理的,但并非不言而喻,因此在这种情况下应该有一个更明显的例外

不幸的是,非speeking异常在JavaFX中非常常见

幸运的是,解决方案/解决方法非常简单:通过
Platform.runLater()
调用您的修改代码(此处:
r1.toFront
),它将延迟您在原始事件之后进行的修改:

root.getChildren().addListener(new ListChangeListener<Node>() {
    @Override
    public void onChanged(ListChangeListener.Change<? extends Node> change) {
        Platform.runLater(new Runnable() {
            public void run() { r1.toFront(); }                 
        });
    }
});
root.getChildren().addListener(新ListChangeListener()){
@凌驾

public void onChanged(ListChangeListener.change如果您的
onChanged()
方法使用
toFront()
更改顺序,这不会启动对您的
onChanged()的另一个调用吗
方法,等等?我怀疑你会得到一个
堆栈溢出错误
,但很明显,这不是你得到的。@DavidConrad很好的观点-在我的实际应用程序中(出于SSCCE的目的被忽略),我会
而(change.next()){if(change.wasdadded()){r1.toFront();                         }                     }
…为了避开这个潜在的问题-但这会导致完全相同的错误。我现在更新了它以使其更清晰。非常棒,感谢这一解决方法,JFX开发人员报告了相同的修复,并同意在这种情况下抛出更好的异常,因此希望在最终发行版之前能够实现,以减少混乱为别人祈祷!
root.getChildren().addListener(new ListChangeListener<Node>() {
    @Override
    public void onChanged(ListChangeListener.Change<? extends Node> change) {
        Platform.runLater(new Runnable() {
            public void run() { r1.toFront(); }                 
        });
    }
});