Gyakorlati alapok IV.
Végre ablakozunk! (AWT, Swing, JavaFX)
Frame bezárása
Eddig lappangott egy szörnyű nagy titok programjainkban: a frame bár megjelent szépen középre pozícionálva...
Végeredmény (a monitor közepén / felbontástól függetlenül/):
...sőt rányomhattunk az aktiváláskor piros bezáró gombra is (X), amely eseményre a frame eltűnt, ám mindez csupán csalóka látszat volt, mert programunk valójában futott tovább! Ezt bizonyítja azon tény, hogy a futtatást leállító gomb...
piros, azaz aktív maradt. Mi történik itt?
Tulajdonképpen még nem kezeltük le első eseményünket, amely ezen a szinten egyáltalán már előfordulhat, ez pedig a bezáró gomb (X) Close eseménye. Alapértelmezésben a Java-rendszer ehhez gombhoz csak elrejtést párosít (Hide) és ezt láthattuk akkor, ha rákattintottunk. Ez a parancs viszont nem állítja le automatikusan programunkat, annak felülírásához kódunkba egy újabb sort kell illesztenünk:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Észrevehetjük benne a konkrét bezáró parancsot: JFrame.EXIT_ON_CLOSE, amely voltaképpen egy elegáns, de határozott System.exit() hívás (A totálisan destruktív magatartás: a System.exit() metódus című fejezet).
Kódcsontvázunk ezzel tehát egy újabb funkcióval bővült. Nézzük meg a módosított Java-kódot:
Main.java
public class Main {
public static void main(String[] args) {
Window window = new Window();
}
}
Window.java
import javax.swing.JFrame;
class Window extends JFrame {
Window() {
super();
JFrame frame = new JFrame();
Center center = new Center();
frame.setSize(400, 300);
frame.setTitle("PJP - Penzes Java
Programming");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
center.setCenter(frame);
frame.setVisible(true);
}
}
Center.java
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import javax.swing.JFrame;
public class Center {
void setCenter(JFrame frame) {
Point center =
GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
int x = (int) center.getX() -
(frame.getWidth() / 2);
int y = (int) center.getY() -
(frame.getHeight() / 2);
Point ablakCenter = new Point(x, y);
frame.setLocation(ablakCenter);
}
}
Végeredmény (a monitor közepén / felbontástól függetlenül/):
-
exit gomb működik
A setDefaultCloseOperation() metódus más paramétereket is képes fogadni, ezek nemcsak JFrame, hanem JInternalPane és JDialog komponensek esetében is felhasználhatók:
-
EXIT_ON_CLOSE - az esemény hatására programkilépés,
-
DO_NOTHING_ON_CLOSE - az esemény hatására nincs történés,
-
HIDE_ON_CLOSE - az esemény hatására csak elrejtés,
-
DISPOSE_ON_CLOSE - az esemény hatására elrejtés és frame megszüntetése, (alapértelmezett JInternalFrame esetében).
Természetesen a System.exit() metódus közvetlen hívásával is bezárhatjuk az alkalmazást. Alább például létrehozunk 1 frame-et és 5 másodperc várakozás után balesetmentesen megszüntetjük:
Main.java
public class Main {
public static void main(String[] args) {
Window window = new Window();
}
}
Window.java
import javax.swing.JFrame;
class Window extends JFrame {
Window() {
super();
JFrame frame = new JFrame();
Center center = new Center();
frame.setSize(400, 300);
frame.setTitle("PJP - Penzes Java
Programming");
center.setCenter(frame);
frame.setVisible(true);
try {
Thread.sleep(5000);
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Center.java
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import javax.swing.JFrame;
public class Center {
void setCenter(JFrame frame) {
Point center =
GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
int x = (int) center.getX() -
(frame.getWidth() / 2);
int y = (int) center.getY() -
(frame.getHeight() / 2);
Point ablakCenter = new Point(x, y);
frame.setLocation(ablakCenter);
}
}
Végeredmény (a monitor közepén / felbontástól függetlenül/):
-
5 másodperc múlva kilépés