Niby prosta sprawa – okienko „zapisz rysunek” przy wychodzeniu z programu processinga. Nie chcemy utracić tworzonej grafiki (problem powstał podczas tworzenia obrazów w GRAPH CREATORZE – softwarze do obsługi Wielozadaniowej maszyny 2D/3D do zadań precyzyjnych), więc musi sie pojawić dialog o zapisie/odrzeceniu tworzonej pracy. Nie wystarczyło nadpisać funkcji exit() w processingu…
Okienka w Processingu oparte są (chyba) na tzw. JFrame’ach. Aby nimi sterować musimy się dostać do obiektu odpowiedzialnego za konkretne okno w aplikacji. Na początku trzeba utworzyć uchwyt do JFrame’a:
import javax.swing.JFrame; import processing.awt.PSurfaceAWT; ... PSurfaceAWT surf = (PSurfaceAWT) getSurface(); PSurfaceAWT.SmoothCanvas canvas = (PSurfaceAWT.SmoothCanvas) surf.getNative(); JFrame jframe = (JFrame) canvas.getFrame(); //uchwyt ...
Otrzymany w ten sposób uchwyt można wykorzystać do modyfikacji działania okienka, np. ustawienie czynności przy zamykaniu okna:
jframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
Po dodaniu tych linijek kodu można zauważyć, że nic się nie zmieniło. Processing również rejestruje czy użytkownik próbuje zamknąć okno i wywołuje specjalną metodę to zamykania programu: exit().
Teraz wystarczy tą metodę nadpisać własnym kodem aby otrzymać dialog z potwierdzeniem wyłączenia programu:
void exit(){ // nadpisanie metody exit() int id = showConfirmDialog( frame, "Are you sure?", // tekst okienka "Exiting", // tytuł okna YES_NO_OPTION); // opcja przycisków if(id == 0){ //id 0 dla przycisku “Yes” super.exit(); } }
Okienko zwróci 0 dla przycisku “Yes”, 1 dla przysku “No” oraz -1 jeżeli zamkniemy okienko dialogowe wciskając “X”. Następnie można sprawdzić wartość zmiennej “id” i wywołać nienadpisaną wersję metody exit() przy użyciu super.exit() gdy “id” wynosi 1. Wówczas Processing zajmie się resztą i zamknie aplikację.
Do działania dialogów trzeba jeszcze dodać:
import static javax.swing.JOptionPane.*; (tutaj import jako klasa statyczna?)
Całość wygląda więc tak
import javax.swing.JFrame; import processing.awt.PSurfaceAWT; import static javax.swing.JOptionPane.*; void setup(){ size(900,600); PSurfaceAWT surf = (PSurfaceAWT) getSurface(); PSurfaceAWT.SmoothCanvas canvas = (PSurfaceAWT.SmoothCanvas) surf.getNative(); JFrame jframe = (JFrame) canvas.getFrame(); //uchwyt jframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); } void draw(){ rect(100,100, 200, 200); } void exit(){ int id = showConfirmDialog( frame, "Are you sure?", // message "Exiting", // tytuł okna YES_NO_OPTION); println(id); if(id == 0){ super.exit(); } }
I po problemie! Zachęcam do kopiowania tego rozwiząnia — (c) Bartosz Butler, 2019