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:
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/):
-
exit gomb működik
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:
-
x - a koordinátarendszer vízszintes tengelyét jelenti - ebben az esetben a frame bal felső sarkától számított vízszintes pixeltávolság,
-
y - a koordinátarendszer függőleges tengelyét jelenti - ebben az esetben a frame bal felső sarkától számított függőleges pixeltávolság,
-
width - a label szélessége pixelben,
-
height - a label magassága pixelben.
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:
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/):