当用户试图退出程序时,程序能够有机会进行确认和清理的工作。因此,正确的程序退出过程应该包含一些步骤
-
增加Button或菜单,让用户发布希望退出程序的信号。
-
(可选)显示窗口,确认用户真的希望退出程序。
-
执行必要的清理工作,如:关闭文件和其他资源。
-
执行primary stage的
close
方法,关闭应用程序。
虽然我们做了上述工作,但用户依然可以通过直接点击窗口右上角X的方式绕过我们精心设计的代码,直接关闭程序。幸运的是,JavaFX提供了机会让我们阻止这样的事发生。
当用户试图关闭窗口时,JavaFX会产生一个
CloseRequest
事件,并发送给窗口对应的舞台。我们可以调用
Stage
类的
setOnCloseRequest
方法,为这个事件提供一个事件处理器。当用户关闭窗口的时候,这个事件管理器就会被调用。
直接的方法就是让我们的Close按钮和
CloseRequest
事件共享相同的事件处理器
btnClose.setOnAction(e -> btnClose_Click())
primaryStage.setOnCloseRequest(e -> btnClose_Click())
如果事件处理器中包含确认步骤,确认的结果可能是用户放弃关闭程序。但是,对于
CloseRequest
事件,程序依然会被关闭。这是因为事件处理器如果没有调用
close
方法关闭stage,那么
CloseRequest
事件会按照预定的顺序继续传播到该事件的下一个处理器,因此程序还是会被关闭。为了阻止事件的传播,我们调用事件的
consume
方法,这样就避免了JavaFX在事件处理后自动关闭stage。
处理两种关闭事件差异的简单方法是,总是消费掉
CloseRequest
事件
btnClose.setOnAction(e -> btnClose_Click())
primaryStage.setOnCloseRequest(
e -> {
e.consume()
btnClose_Click()})
当用户试图退出程序时,程序能够有机会进行确认和清理的工作。因此,正确的程序退出过程应该包含一些步骤增加Button或菜单,让用户发布希望退出程序的信号。(可选)显示窗口,确认用户真的希望退出程序。执行必要的清理工作,如:关闭文件和其他资源。执行primary stage的close方法,关闭应用程序。虽然我们做了上述工作,但用户依然可以通过直接点击窗口右上角X的方式绕过我们精心设计的代码,
1.
stage
.hide() 与
stage
.close() 等价, 详见http://docs.oracle.com/
javafx
/2/api/
javafx
/
stage
/
Stage
.html#close()
2. 如果要阻止Fx窗口在按下
关闭
按钮后
退出
,的确需要setOnCloseReq...
JavaFX
中使用多线程与保证 UI 线程安全
JavaFX
中使用多线程
JavaFX
中保证 UI 线程安全总结与补充
JavaFX
中的 UI 和大多数其它的编程语言一样,是单线程的。前人很早就已经多次尝试在 UI 上使用多线程,大多都已失败告终。为保证 UI 界面的流畅,UI 线程不能执行非常耗时的操作。如果 UI 线程执行正在非常耗时的操作,这个后果在 UI 界面的体现就是,UI 界面会一直停滞在执行耗时前的状态,然后此时如果马上多次随意点击 UI 界面的任何部位,此时会发生如下现象:
您可以将FXUtils用作
JavaFX
项目中的依赖项。
FXUtils是使用Maven和Java 8构建的。它在Maven Central中尚不可用,因此您必须克隆项目并将其构建在本地计算机上。 如果您有Maven,只需从顶层文件夹运行mvn clean install ,然后将其作为依赖项添加到
JavaFX
项目中。
确保将FXUtils与Java 8结合使用。它不适用于JVM的较早版本。
fxu :具有通用静态方法的类(尚不具有自己的类别)
fxu.builder。 *:构建器类和接口,可简化
JavaFX
视图的构建
fxu.controller :
JavaFX
控制器的基类
fxu.dialog。 *:
JavaFX
对话框的实用
程序
方法和包装器
fxu.event。 *:
JavaFX
事件的实用
程序
方法
JavaFX
程序
可以使用 Java 内置的网络 API 进行网络连接。具体来说,可以使用 java.net 包中的类,如 URL、URLConnection、HttpURLConnection 等。
下面是一个简单的
JavaFX
程序
进行网络连接的示例:
```java
import
javafx
.application.Application;
import
javafx
.scene.Scene;
import
javafx
.scene.control.Label;
import
javafx
.scene.layout.StackPane;
import
javafx
.
stage
.
Stage
;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class NetworkExample extends Application {
@Override
public void start(
Stage
primary
Stage
) throws Exception {
// 创建一个标签用于显示从网络获取的数据
Label label = new Label("Loading...");
// 创建一个栈面板,并将标签添加到其中
StackPane root = new StackPane();
root.getChildren().add(label);
// 创建一个场景,并将栈面板添加到其中
Scene scene = new Scene(root, 300, 250);
// 从网络获取数据,并将其显示在标签中
String data = fetchDataFromUrl("https://www.example.com");
label.setText(data);
// 显示场景
primary
Stage
.setScene(scene);
primary
Stage
.show();
// 从指定的 URL 获取数据
private String fetchDataFromUrl(String urlString) throws Exception {
// 创建一个 URL 对象
URL url = new URL(urlString);
// 打开连接
URLConnection connection = url.openConnection();
// 创建一个输入流读取器,并将连接的输入流包装进去
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
// 读取数据
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
//
关闭
读取器
reader.close();
// 返回获取的数据
return sb.toString();
public static void main(String[] args) {
launch(args);
这个示例
程序
从指定的 URL 获取数据,并将其显示在一个标签中。可以根据实际需求修改其中的代码。