You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何等待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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:15:29