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):

 

www.informatika-programozas.hu - Frame

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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/):

 

www.informatika-programozas.hu - Frame

 

Természetesen a kódmódosítás megoldható úgy is, hogy a center-rutint a Window- osztályba építjük be:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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/):

 

www.informatika-programozas.hu - Frame