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

Java Processing多窗口切换触发handleDraw()调用异常问题求助

问题解决:Processing多窗口切换崩溃(handleDraw() called before finishing)

核心原因

重复调用窗口切换方法(openPreviousWindow()),导致Processing的绘图线程出现冲突,多次叠加后触发handleDraw() called before finishing异常。

修复方案(无需重构现有类结构)


1. 给窗口切换方法加执行锁

在每个继承自PApplet的窗口类中添加布尔标记,防止方法被重复调用:

private boolean isSwitching = false;

public void openPreviousWindow() {
    // 已在切换流程中则直接返回
    if (isSwitching) return;
    isSwitching = true;

    // 原有窗口切换逻辑
    this.exit();
    PApplet.runSketch(new String[]{"Main"}, new Main());
}

2. 修正按钮点击事件的触发逻辑

不要在draw()中处理按钮点击(draw()每秒执行60次,易重复触发),改用Processing的mousePressed()方法处理:

void mousePressed() {
    // 假设backButton是你的返回按钮对象
    if (backButton.contains(mouseX, mouseY)) {
        openPreviousWindow();
    }
}

确保按钮点击逻辑只在鼠标按下时触发一次,而非多次。

3. 保证旧窗口彻底销毁

通过线程延迟执行窗口销毁,避免主线程阻塞导致的绘图线程异常:

public void openPreviousWindow() {
    if (isSwitching) return;
    isSwitching = true;

    final PApplet currentWindow = this;
    new Thread(() -> {
        // 短暂延迟确保窗口资源释放
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        currentWindow.exit();
        // 替换为你要打开的上一级窗口类
        PApplet.runSketch(new String[]{"FitnessAppSportsUdøver"}, new FitnessAppSportsUdøver());
    }).start();
}

4. 规避无效绘图操作

在每个窗口类的draw()方法开头添加判断,仅当窗口可见时执行绘图逻辑:

void draw() {
    if (!this.isVisible()) return;
    // 原有绘图代码
}

验证要点

  • 添加日志打印,确认openPreviousWindow()不再被重复调用
  • 检查任务管理器中的Java进程数,确保每次切换后旧窗口进程被销毁

内容的提问来源于stack exchange,提问作者Ageforce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:24:53