Java Processing, Моя программа обработки выдает handleDraw(), вызываемую перед завершением, при постоянном открытии новых эскизов

в настоящее время я борюсь с серьезной проблемой с моей программой обработки Java. Я делаю программу так, что когда вы нажимаете кнопку, она открывает новый скетч (новое окно) и закрывает предыдущее. В новом окне есть кнопка «Назад», с помощью которой можно вернуться к предыдущему окну.

Если я нажимаю кнопку «назад» во второй раз, когда открывается предыдущее окно, программа вылетает и выдает следующую ошибку:

handleDraw() called before finishing

Странно то, что программа вылетает только после того, как я пару раз нажму на кнопки. Каждый раз программа вылетает после нажатия в общей сложности 5 кнопок. Вместо сбоя я, конечно, должен иметь возможность многократно открывать и закрывать два разных эскиза (окна).

Я убедился, что draw(); методы не могут работать одновременно.

Примечания: Класс «Knap» — это класс кнопок. Все классы «Fitness», «Main» и «Morgenmad» расширяются от PApplet, поэтому я могу создать экземпляр каждого класса, а затем запустить draw(); и настройки(); метод в каждом классе с помощью PApplet.runSketch(); всякий раз, когда я хочу, чтобы открыть новое окно. Я знаю, что это не лучший способ сделать это, но я пишу это для проекта, и уже слишком поздно полностью переписывать.

Вот код: (Имейте в виду, что моя программа на самом деле намного больше, чем код, который я предоставил, но я удалил весь код, который не имеет отношения к демонстрации проблемы, с которой я столкнулся. Я также добавил графический интерфейс и Класс Knap в том же файле, чтобы было проще показать мой код здесь)

import processing.core.PImage;
import java.awt.*;

public class Main extends PApplet {
    GUI gui = new GUI(this);
    boolean fitnessAppSportsUdøverWindow = false;
    boolean morgenmadWindow = false;
    boolean mainWindow = true;

    PImage image;
    String[] fitnessAppSportsUdøverArgs = {"FitnessAppSportsUdøver"};
    String[] morgenmadArgs = {"Morgenmad"};
    Knap morgenmadKnap;
    FitnessAppSportsUdøver fasu = new FitnessAppSportsUdøver();
    MorgenmadMenu mm = new MorgenmadMenu();


    public static void main(String[] args) {
        Main program = new Main();
        String[] processingArgs = {"Teknologi FitnessApp"};
        PApplet.runSketch(processingArgs, program);
    }

    public void settings() {
        size(800, 800);

    }

    public void draw() {
        if (mainWindow && !fitnessAppSportsUdøverWindow) {
            windowTitle("Teknologi FitnessApp");

            gui.draw();
            System.out.println("main = " + mainWindow);


        }
        if (!mainWindow && fitnessAppSportsUdøverWindow) {
            closePreviousWindow();
            System.out.println("main = " + mainWindow);
            stop();
        }

    }

    private void closePreviousWindow() {
        if (fitnessAppSportsUdøverWindow) {
            Frame[] frames = Frame.getFrames();
            for (Frame frame : frames) {
                if (frame.getTitle().equals("Teknologi FitnessApp")) {
                    frame.dispose();

                }

            }
        }
        Frame[] frames = Frame.getFrames();
        for (Frame frame : frames) {
            if (frame.getTitle().equals("FitnessAppSportsUdøver") && morgenmadWindow) {
                frame.dispose();

            }
        }
    }

    public void mousePressed() {
        //gui.mousePosition();

        if (gui.knap1.overKnap()) {
            drawFitnessAppSportsUdøver();
        }
    }

    void drawFitnessAppSportsUdøver() {
        mainWindow = false;
        fitnessAppSportsUdøverWindow = true;
        System.out.println("FITNESSAPP DRAWN");
        PApplet.runSketch(fitnessAppSportsUdøverArgs, fasu);

    }

    void drawMorgenmadMenu() {
        fitnessAppSportsUdøverWindow = false;
        morgenmadWindow = true;
        System.out.println("MORGENMADMENU DRAWN");
        PApplet.runSketch(morgenmadArgs, mm);

    }

    class FitnessAppSportsUdøver extends PApplet {

        FitnessAppSportsUdøver() {
            morgenmadKnap = new Knap(this, 722, 527, 50, 50, 0, 210);
        }

        public void settings() {
            size(800, 800);
            image = loadImage("teknologi fitnessapp2.png");
        }

        public void draw() {
            if (fitnessAppSportsUdøverWindow && !morgenmadWindow) {
                morgenmadKnap.draw();

                System.out.println("fit = " + fitnessAppSportsUdøverWindow + " morgenmad = " + morgenmadWindow + " main = " + mainWindow);

            }
            if (!fitnessAppSportsUdøverWindow && morgenmadWindow) {
                closePreviousWindow();
                System.out.println("fit = " + fitnessAppSportsUdøverWindow + " morgenmad = " + morgenmadWindow + " main = " + mainWindow);
                stop();
            }
        }

        public void mousePressed() {

            if (morgenmadKnap.overKnap()) {
                drawMorgenmadMenu();
            }
        }
    }

    class MorgenmadMenu extends PApplet {
        Knap tilbageKnap = new Knap(this, 20, 100, 100, 100, 0, 210);

        public void settings() {
            size(800, 800);
        }

        public void draw() {
            if (morgenmadWindow && !fitnessAppSportsUdøverWindow) {
                background(255, 255, 255);

                tilbageKnap.draw();

                System.out.println("morgenmad = " + morgenmadWindow + " fit = " + fitnessAppSportsUdøverWindow + " main = " + mainWindow);

            }
            if (!morgenmadWindow && fitnessAppSportsUdøverWindow) {
                closePreviousWindow();
                System.out.println("morgenmad = " + morgenmadWindow + " fit = " + fitnessAppSportsUdøverWindow + " main = " + mainWindow);
                stop();
            }
        }

        public void mousePressed() {
            if (tilbageKnap.overKnap()) {
                openPreviousWindow();
            }
        }

        void openPreviousWindow() {
            Frame[] frames = Frame.getFrames();
            for (Frame frame : frames) {
                if (frame.getTitle().equals("MorgenmadMenu")) {
                    //drawFitnessAppSportsUdøver();
                    System.out.println("FITNESSAPP DRAWN OPENPREVIOUS WINDOW");

                    morgenmadWindow = false;
                    fitnessAppSportsUdøverWindow = true;

                    PApplet.runSketch(fitnessAppSportsUdøverArgs, fasu);


                    frame.dispose();

                }
            }
        }
    }


    class GUI {
        PApplet p;
        Knap knap1;
        PImage image;

        public GUI(PApplet p) {
            this.p = p;
            knap1 = new Knap(p, 319, 675, 190, 100, 255, 100);
        }

        void draw() {
            knap1.draw();

            displayTekst();

            image = p.loadImage("girl healthy.jpg");
            image.resize(600, 530);
            p.image(image, p.width / 2 - 285, 122);
        }


        void displayTekst() {
            p.fill(0);
            p.textSize(40);
            p.text("Velkommen til FitForSport", p.width / 2 - 210, 50);
            p.smooth();

            p.textSize(20);
            p.text("Du har taget det første skridt for et bedre liv med sport", p.width / 2 - 210, 100);
            p.smooth();

            p.textSize(60);
            p.text("Start", 355, 740);
            p.smooth();
        }

        void mousePosition() {
            System.out.println("X koordinat " + p.mouseX + " Y koordinat " + p.mouseY);
            System.out.println("");
        }
    }

    class Knap {
        PApplet p;
        int farve, hover;
        float posX, posY, width, height;

        public Knap(PApplet p, float posX, float posY, float width, float height, int f, int h) {
            this.p = p;
            this.posX = posX;
            this.posY = posY;
            this.width = width;
            this.height = height;
            farve = f;
            hover = h;
        }

        boolean overKnap() {
            if (p.mouseX >= posX && p.mouseX <= posX + width && p.mouseY >= posY && p.mouseY <= posY + height) {
                return true;
            }
            return false;
        }

        void draw() {
            if (overKnap())
                p.fill(hover);
            else
                p.fill(farve);
            p.rect(posX, posY, width, height);
        }
    }
}

Я создал систему отладки, чтобы убедиться, что методы draw() не выполняются одновременно. Интересно отметить, что похоже на openPreviousWindow(); метод запускается дважды, когда вы нажимаете кнопку в какой-то момент, а затем программа вылетает. Я сделал так, что программа что-то выводит при вызове этого метода, и вы можете видеть здесь, что она запускается дважды, а затем программа падает.

morgenmad = true fit = false main = false
morgenmad = true fit = false main = false
morgenmad = true fit = false main = false
FITNESSAPP DRAWN OPENPREVIOUS WINDOW
fit = true morgenmad = false main = false
FITNESSAPP DRAWN OPENPREVIOUS WINDOW
fit = true morgenmad = false main = false
fit = true morgenmad = false main = false
handleDraw() called before finishing

спасибо за редактирование :) Вы можете рассмотреть возможность предоставления минимального воспроизводимого примера (обратите внимание на M!), демонстрирующего проблему - это выглядит как слишком много потенциально несвязанного кода.

kleopatra 20.04.2023 13:23

Я сделаю это, когда вернусь домой. Спасибо!

Ageforce 20.04.2023 17:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Одним из вариантов было бы создать все окна при запуске Processing(), но показать только mainWindow и скрыть остальные с помощью surface.setVisible(false) по мере их создания. Когда они нужны, используйте .setVisible(true), чтобы показать их, и скройте остальные с помощью .setVisible(false). Я думаю, что метод «показать/скрыть» вызовет меньше проблем, чем избавление от них, а затем попытка их повторного создания. Далее следует простая демонстрация; обратите внимание, что исходное окно обработки создается по умолчанию, но не используется. Каждое из двух окон PApplet создается только один раз.

import java.awt.Frame;
import processing.awt.PSurfaceAWT;

int _btnX = 50;
int _btnY = 50;
int _btnW = 200;
int _btnH = 30;

WindowOne wndOne;
WindowTwo wndTwo;

processing.awt.PSurfaceAWT wnd1;
processing.awt.PSurfaceAWT wnd2;

class WindowTwo extends PApplet {

  WindowTwo () {
    PApplet.runSketch(new String[]{this.getClass().getName()}, this);
    surface.setTitle("Window Two");
    println("wnd2 = ",surface);
    surface.setVisible(false);
    wnd2 = (PSurfaceAWT)surface;    
  }

  void settings() {
    size(300, 200);
  }

  void setup() {
    background(209);
  }

  void draw() {
    fill(color(0, 255, 0));
    rect(50, 50, 200, 30);
    fill(0);
    textSize(20);
    textAlign(CENTER, CENTER);
    text("Show Window One", _btnX, _btnY, _btnW, _btnH);
  }

  void mousePressed() {
    if ((mouseX >= _btnX) && (mouseX <= _btnX + _btnW) && (mouseY >= _btnY) && (mouseY <= _btnY + _btnH)) {      
      surface.setVisible(false); // Hide this window
      wnd1.setVisible(true);     // Show the other one
    }
  }
}

class WindowOne extends PApplet {

  WindowOne () {
    PApplet.runSketch(new String[]{this.getClass().getName()}, this);
    surface.setTitle("Window One");
    surface.setLocation(400, 400);
    println("wnd1 = ",surface);
    wnd1 = (PSurfaceAWT)surface;
  }

  void settings() {
    size(400, 200);
  }

  void setup() {
    background(255);
  }

  void draw() {
    fill(color(0, 255, 0));
    rect(50, 50, 200, 30);
    fill(0);
    textSize(20);
    textAlign(CENTER, CENTER);
    text("Show Window Two", _btnX, _btnY, _btnW, _btnH);
  }

  void mousePressed() {
    if ((mouseX >= _btnX) && (mouseX <= _btnX + _btnW) && (mouseY >= _btnY) && (mouseY <= _btnY + _btnH)) {
      surface.setVisible(false);  // Hide this window
      wnd2.setVisible(true);    // Show the other one
    }
  }
}

void setup() {
  surface.setVisible(false);
  println("default = ",surface);
  wndOne = new WindowOne(); // Build two, but show only one
  wndTwo = new WindowTwo(); // Originally not shown
}

Другие вопросы по теме