在SWT(Standard Widget Toolkit)中监听窗口关闭事件,可通过以下两种主要方法实现:
一、使用 `WindowListener` 监听关闭事件
通过为窗口添加 `WindowAdapter` 并重写 `windowClosing` 方法,可控制窗口关闭行为。例如,添加确认对话框或执行清理操作:
```java
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.WindowAdapter;
import org.eclipse.swt.events.WindowEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class CloseWindowExample {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("关闭窗口示例");
shell.setSize(300, 200);
// 添加WindowListener监听器
shell.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// 弹出确认对话框
if (SWT.YES == e.userChoice) {
System.out.println("窗口已关闭");
shell.dispose(); // 执行关闭操作
}
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
```
说明:
1. 创建 `Display` 和 `Shell` 对象,并设置布局。
2. 通过 `shell.addWindowListener` 添加 `WindowAdapter`,重写 `windowClosing` 方法。
3. 在 `windowClosing` 方法中,通过 `e.userChoice` 判断用户是否确认关闭,若确认则调用 `shell.dispose()` 结束程序。
二、使用 `Display.addShutdownHook` 注册关闭钩子
`Display.addShutdownHook` 可以在JVM关闭时执行指定任务,适用于需要在程序退出前执行清理操作(如释放资源、保存数据等):
```java
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class ShutdownHookExample {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("关闭钩子示例");
shell.setSize(300, 200);
shell.open();
// 添加关闭钩子
display.addShutdownHook(new Thread(() -> {
System.out.println("JVM关闭钩子被触发");
// 执行清理操作
shell.dispose();
}));
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
```
说明:
1. 创建 `Display` 和 `Shell` 对象并设置布局。
2. 调用 `display.addShutdownHook` 注册一个线程,该线程包含需要在JVM关闭时执行的代码(如 `shell.dispose()`)。
补充说明
非UI线程关闭:若关闭操作涉及非UI线程(如数据库连接),需确保在事件调度线程(EDT)中执行 `dispose()` 或关闭相关资源。
资源释放:关闭窗口时,建议同时释放所有占用的资源(如数据库连接、文件句柄等),避免资源泄漏。
通过以上方法,可灵活控制SWT应用程序的关闭行为,确保数据完整性和资源合理释放。