FFd*_*per 2 java javafx java-8 gluon gluon-mobile
我有一个动画计时器,当我处理结束时,如果某个条件为真,我想向用户显示一个对话框。当我只是尝试在 stop() 方法之后调用对话框时,我遇到了这个异常(仅在移动设备上):
java.lang.IllegalStateException:动画或布局处理期间无法进入嵌套循环
因此,对于这种情况,我解决了将对话框包装在 Platform.runLater() 方法中的问题。
这是处理这种情况的正确方法吗?
如果不是,哪个是正确的?
我正在使用的对话框是胶子对话框:
http://docs.gluonhq.com/charm/javadoc/4.2.0/com/gluonhq/charm/glisten/control/Dialog.html
而在这个简单的表演上是不存在的,只有表演和等待。
我添加了一个AlertinsideAnimationTimer来重现这个问题:
private long count = 0;
public BasicView(String name) {
super(name);
AnimationTimer timer = new AnimationTimer() {
private long time;
@Override
public void handle(long now) {
if (now - time > 1_000_000_000) {
count++;
if (count == 5) {
Alert alert = new Alert(Alert.AlertType.INFORMATION, "Hi there");
alert.showAndWait();
}
time = now;
}
}
};
setCenter(new StackPane(new Label("Hello JavaFX World!")));
setOnShown(e -> timer.start());
setOnHidden(e -> timer.stop());
}
Run Code Online (Sandbox Code Playgroud)
无论您选择javafx.scene.control.Alert:
Exception in thread "JavaFX Application Thread" java.lang.IllegalStateException: showAndWait is not allowed during animation or layout processing
at javafx.scene.control.Dialog.showAndWait(Dialog.java:328)
Run Code Online (Sandbox Code Playgroud)
或com.gluonhq.charm.glisten.control.Alert:
Exception in thread "JavaFX Application Thread" java.lang.IllegalStateException: Cannot enter nested loop during animation or layout processing
at com.sun.javafx.tk.quantum.QuantumToolkit.enterNestedEventLoop(QuantumToolkit.java:570)
at com.gluonhq.charm.glisten.control.Dialog.a(SourceFile:613)
Run Code Online (Sandbox Code Playgroud)
以及您是否在桌面或 Android 上运行它:
04-05 17:50:48.289 9592 9627 E AndroidRuntime: java.lang.IllegalStateException: Cannot enter nested loop during animation or layout processing
04-05 17:50:48.289 9592 9627 E AndroidRuntime: at com.sun.javafx.tk.quantum.QuantumToolkit.enterNestedEventLoop(QuantumToolkit.java:585)
04-05 17:50:48.289 9592 9627 E AndroidRuntime: at com.gluonhq.charm.glisten.control.Dialog.a(SourceFile:613)
Run Code Online (Sandbox Code Playgroud)
Dialog 实现 (JavaFX/Gluon) 使用Toolkit.getToolkit().enterNestedEventLoop(), 如果您检查 Quantum实现:
if (!canStartNestedEventLoop()) {
throw new IllegalStateException("Cannot enter nested loop during animation or layout processing");
}
Run Code Online (Sandbox Code Playgroud)
如果您在动画中尝试此操作:
@Override
public void handle(long now) {
System.out.println("In pulse: " + !Toolkit.getToolkit().canStartNestedEventLoop());
}
Run Code Online (Sandbox Code Playgroud)
您将在动画中看到您的脉冲是真实的:根据 animationTimer 的定义,handle在每个脉冲上都被精确调用!
所以你不能进入嵌套的事件循环,除非你避免在那一刻调用。Platform.runLater()这只是稍后再做的一种方式。
所以这会正常工作:
@Override
public void handle(long now) {
if (now - time > 1_000_000_000) {
count++;
if (count == 5) {
Alert alert = new Alert(AlertType.INFORMATION, "Hi there");
Platform.runLater(alert::showAndWait);
}
time = now;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2323 次 |
| 最近记录: |