Gyakorlati alapok IV.

Végre ablakozunk! (AWT, Swing, JavaFX)

 

2 db label

 

Az előző, Label a frame-en című fejezetben megismerkedtünk a label (felirat) frame-re történő ráhelyezésével és alapszintű konfigurálásával. A következő lépés nyilvánvalóan 2 db label menedzselése lesz.

 

Ismételjük meg alapkódunkat:

 

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.JLabel;
import javax.swing.SwingConstants;

class Window extends JFrame {
    Window() {
        super();
        JFrame frame = new JFrame();
        JLabel label = new JLabel();
        label.setText("PJP - Penzes Java Programming");
        frame.add(label);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        label.setHorizontalAlignment(SwingConstants.CENTER);
        label.setVerticalAlignment(SwingConstants.TOP);
        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 + Label

 

2 db label esetén nagy valószínűséggel szabályoznunk kell a label-ek egymáshoz való formai viszonyát is. Ezt nagyon aprólékosan, pixelméretben meg tudjuk tenni a létrehozott label objektum(ok) egy különleges, igazító függvényével (setBounds(x, y, with, height)), amelyben:

A metódus láthatóan nagyon precízen képes beigazítani a label-eket, ám rossz vagy értelmetlen pixelméretek megadásakor nagyon szét tudja csúsztatni az objektumokat.

 

Még valamit be kell állítanunk.

A Játék: Wollen Sie arbeiten? (Akar Ön dolgozni?) című fejezetben már szó esett a frame beépített konténeregységéről a getContentPane() függvény kapcsán. Ennek van egy elrendezéskezelője is (layout manager), amely félig automatikusan praktikus és kényelmes lehetőségeket biztosít a komponensek frame-ben történő elrendezéséhez. Gondoljunk például az előző fejezet igazítási függvényeire...

 

label.setHorizontalAlignment(SwingConstants.CENTER);
label.setVerticalAlignment(SwingConstants.CENTER);

 

...amelyek relatív komponenselrendezést tesznek lehetővé, hiszen láthatjuk, hogy nem pixelben, hanem relatív paraméterek felhasználásával állítjuk a komponenesek pozícióit, például: TOP, BOTTOM, CENTER, LEFT, RIGHT, stb.

 

Azonban a setBounds() függvény meghívásával a komponenst valójában abszolút pozícionáljuk a frame-en belül, ezért a konténer belső elrendezéskezelőjét ki kell kapcsolni a setLayout(null) utasítással.

 

Ezenfelül nyilvánvalóan a 2 db label-t külön objektumként kell létrehoznunk és tovább menedzselnünk label1 és label2 néven.

 

Nézzük meg a futtatható Java-kódot:

 

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.JLabel;

class Window extends JFrame {
    Window() {
    super();
    JFrame frame = new JFrame();
    JLabel label1 = new JLabel();
    JLabel label2 = new JLabel();
    label1.setText("PJP - Penzes Java Programming...");
    label2.setText("...is the best of all...");
    label1.setBounds(50, 50, 300, 20);
    label2.setBounds(50, 75, 150, 20);
    frame.add(label1);
    frame.add(label2);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Center center = new Center();
    frame.setSize(400, 300);
    frame.setTitle("PJP - Penzes Java Programming");
    center.setCenter(frame);
    frame.setLayout(null);
    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 + Label