в настоящее время я борюсь с серьезной проблемой с моей программой обработки 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
Я сделаю это, когда вернусь домой. Спасибо!




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