Gyakorlati alapok IV.
Végre ablakozunk! (AWT, Swing, JavaFX)
Frame középre igazítva
Az előző, Frame pozícionálása című fejezetben mindenféle módon pozícionálgattunk egy frame-et, amelynek egyik lehetséges végeredménye így nézett ki:
Végeredmény (a monitor bal felső sarkától 500 és 250 pixelre):
A következő probléma talán nem azonnal, de előbb-utóbb jelentkezni fog: a képernyőfelbontások szélsőségesen különbözőek lehetnek.
Például ha a megrendelő 55 colos UHD monitorral rendelkezik (amint a jelen sorok írója szintén), akkor minimum a haját fogja tépni, maximum nem fizet, mert a frame még a pozícionálás ellenére is a szoba másik sarkában lesz. Ha viszont túl nagyok a pozícionálás x és y adatai, akkor kis felbontás esetén jobbra lelóghat a monitorról vagy más hibajelenségeket produkálhat. Célszerű tehát mielőbb találni egy olyan rutint, amely a futtatott frame-et a mindenkori képernyőfelbontás közepére pozícionálja. A felhasznált középrezáró (center) kód természetesen külön osztályba kerül:
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);
}
}
A Center osztályt a Window osztályban példányosítjuk (Center center = new Center()), amelynek voltaképpen csupán 1 metódusa van, a setCenter(JFrame frame). Bemeneti paraméterként pedig pontosan a mi frame-ünket várja szeretettel, menedzselése tehát nem lesz nehéz: center.setCenter(frame).
Nézzük meg a futtatható Java-kódunkat, egyébiránt ez lesz az új kódkeretünk, mert a Center osztályt ezután már cipeljük magunkkal a többi osztállyal együtt:
Main.java
public class Main {
public static void main(String[] args) {
Window window = new Window();
}
}
Window.java
import javax.swing.JFrame;
import javax.swing.WindowConstants;
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);
}
}
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/):
Természetesen a kódmódosítás megoldható úgy is, hogy a center-rutint a Window- osztályba építjük be:
Main.java
public class Main {
public static void main(String[] args) {
Window window = new Window();
}
}
Window.java
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import javax.swing.JFrame;
class Window extends JFrame {
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);
}
Window() {
super();
JFrame frame = new JFrame();
frame.setSize(400, 300);
frame.setTitle("PJP - Penzes Java
Programming");
setCenter(frame);
frame.setVisible(true);
}
}
Végeredmény (a monitor közepén / felbontástól függetlenül/):