如何等待JFrame关闭后再执行方法中的剩余代码?
问题原因
Swing的JFrame默认是非模态窗口,调用setVisible(true)后不会阻塞后续代码执行——你刚显示窗口就去读取静态变量cal,此时用户还没完成数据输入,自然拿不到更新后的值。
解决方案
方案1:改用模态JDialog(最直接)
把VentanaHora从继承JFrame改成继承JDialog,设置为模态窗口后,调用setVisible(true)会阻塞当前线程,直到窗口关闭再执行后续代码:
public class VentanaHora extends JDialog { private Calendar cal; // 用实例变量替代静态变量,更符合面向对象设计 // 构造方法指定模态属性 public VentanaHora(Frame owner) { super(owner, true); // true表示模态 // 你的窗口初始化逻辑(组件、事件绑定等) } // 提供获取Calendar的方法 public Calendar getCal() { return cal; } }
调用示例:
// parentFrame为当前父窗口,没有则传null VentanaHora ventanaHora = new VentanaHora(parentFrame); ventanaHora.setVisible(true); // 窗口关闭后才会执行到这里,此时能拿到用户更新后的cal Calendar cal = ventanaHora.getCal();
方案2:添加回调监听器(适合非模态场景)
如果必须保留JFrame,可以通过回调接口在用户完成输入后触发数据获取:
// 定义回调接口 public interface OnCalSelectedListener { void onCalSelected(Calendar cal); } public class VentanaHora extends JFrame { private OnCalSelectedListener listener; private Calendar cal; public void setOnCalSelectedListener(OnCalSelectedListener listener) { this.listener = listener; } // 假设用户点击确认按钮时触发此方法 private void onConfirmClicked() { // 这里执行更新cal的逻辑 cal = ...; // 触发回调传递数据 if (listener != null) { listener.onCalSelected(cal); } this.dispose(); // 关闭窗口 } }
调用示例:
VentanaHora ventanaHora = new VentanaHora(); ventanaHora.setOnCalSelectedListener(new OnCalSelectedListener() { @Override public void onCalSelected(Calendar cal) { // 在这里处理拿到的cal值,比如创建目标对象 createTargetObject(cal); } }); ventanaHora.setVisible(true);
注意事项
- 避免用静态变量传递UI数据,实例变量+getter/回调的方式更安全,能减少线程冲突和代码耦合。
- Swing的UI操作必须在事件调度线程(EDT)中执行,确保线程安全。
内容的提问来源于stack exchange,提问作者Hazzard_09
相关产品推荐
相关产品推荐

