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