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
相关产品推荐
相关产品推荐

