JFX学习笔记 五 重修语法——表达式 (2)

JFX到底是一个什么品种,看完下面的描述各位就清楚了。
JavaFX 的do 语句允许使用者在后台线程中执行一块JavaFX 代码,以便AWT 事件调度线
程继续处理事件,从而防止UI 平台出现挂起现象。目前,在执行后台线程时采用
java.awt.EventQueue 实现了对事件的出/入队操作。通常情况下,所有的JavaFX 代码都在AWT 事件调度线程中执行,只有包含在do 语句体中的语句被允许在另一个线程中执行。
这些代码必须只访问Java 对象,如果需要的话,那些Java 对象还必须处理其自身的线程同
步。
以上说明了什么?说明我们写的JFX其实可以理解成在写Swing,当然这样认识是肤浅了一点 :oops: 目前先这样了。继续说说Do语句
do {
// now in a background thread
var url = new URL("http://www.foo.com/abc.xml");
var is = url.openStream();
var reader = new BufferedReader(new InputStreamReader(is));
var line;
while (true) {
line = reader.readLine();
if (line == null) {
break;
}
result.append(line);
result.append("\n");
}
}
// now back in the EDT
System.out.println("result = {result}");

在上面的示例中,在事件调度线程(EDT)中正在执行,在do 语句执行期间将被阻塞。但如果在等待后台线程完成的期间,一个新的事件调度循环被建立在调用堆栈上,那么在执行do 语句的同时这些GUI 事件将继续被处理。不幸的是,由于它能够引发建立在堆栈上的多重事件调度循环,乃至在糟糕的情况下引起堆栈溢出异常,而目前并没有一种对此称得上优秀的解决方案。
相信大家都多少有点swing的开发经验,我的经验是最好别占用事件派发队列,那样可能导致界面灰化。在测试员眼中这是相当严重的bug。所以以上代码我们需要改进!

do 语句的第二种形式(do later):它允许在事件调度线程中的语句体内进行异步执行,而不是在后台线程中执行(此功能由java.awt.EventQueue.invokeLater 提供)。顾名思义,do later语句体在事件调度线程执行完成后才被执行。例如:
import java.lang.System;
var saying1 = "He llo World!";
var saying2 = "Goodbye Cruel World!";
do later {
System.out.println(saying1);
}
System.out.println(saying2);
运行上面的代码将产生如下输出:
Goodbye Cruel World!
Hello World!

好啦,if,while这些基本类同,大家尝试一下吧,注(没有switch语句了.. :cry: )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaFX中,我们可以通过添加窗口关闭事件的监听器来监视窗口关闭。通过监听窗口关闭事件,我们可以在窗口关闭之前执行一些必要的操作。 要监听窗口关闭事件,我们首先需要获取窗口的Scene对象,然后通过Scene对象获取窗口Stage对象。接下来,我们可以使用Stage的setOnCloseRequest()方法来设置一个窗口关闭事件的监听器。 例如,以下是一个简单的代码示例,演示了如何监听窗口关闭事件: ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class WindowCloseListenerExample extends Application { @Override public void start(Stage primaryStage) { primaryStage.setTitle("Window Close Listener Example"); // 创建一个按钮 Button closeButton = new Button("Close Window"); closeButton.setOnAction(event -> primaryStage.close()); // 创建一个布局,并将按钮添加到布局中 StackPane layout = new StackPane(); layout.getChildren().add(closeButton); // 创建一个场景,并将布局添加到场景中 Scene scene = new Scene(layout, 300, 200); primaryStage.setScene(scene); // 监听窗口关闭事件 primaryStage.setOnCloseRequest(event -> { // 在窗口关闭之前执行一些操作,比如保存数据或清理资源 System.out.println("Window is closing..."); }); primaryStage.show(); } public static void main(String[] args) { launch(args); } } ``` 在上面的例子中,我们创建了一个简单的JavaFX应用程序,其中包含一个窗口和一个按钮。当点击按钮时,程序会关闭窗口。同时,在窗口关闭之前,我们通过setOnCloseRequest()方法设置了一个窗口关闭事件的监听器,并在监听器中打印出一条消息。 当我们运行上述代码时,我们可以看到当点击窗口的关闭按钮时,程序会先输出"Window is closing...",然后关闭窗口。 这就是如何在JavaFX中监听窗口关闭事件的基本过程。通过监听窗口关闭事件,我们可以在窗口关闭之前执行一些必要的操作,以确保程序的正常退出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值