Gyakorlati alapok IV.
Végre ablakozunk! (AWT, Swing, JavaFX)
Label + IP-cím
Ebben a rövid fejezetben egy label objektumon keresztül kiírjuk az aktuális IP-címeinket. A hálózati ismeretekben kevésbé jártasak a Hálózati alapfogalmak című fejezetből pótolhatják a szükséges alapismereteket.
Programozási kiindulópontunk a frame-en belül minden oldalról középre igazított felirat és ennek alapkódja:
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.CENTER);
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
Az aktuális IP-cím a label új szövege lesz.
Amit ehhez még mindenféleképpen tudnunk kell, hogy az IP-címhez mindig tartozik egy név is (host name vagy domain name, illetve ezek kombinációja), hiszen éppen ez a név-szám hozzárendelés a lényege a DNS-szolgáltatásnak (Domain Name System): a nehezen megjegyezhető IP-címeket nevekre fordítja át. Magát a lekérdezési folyamatot névfeloldásnak (host name resolution) nevezzük.
Gépünk alapszintű, TCP/IP alapú hálózati működéséhez sokfelől szerezhetünk IP-címet (nem említve a további hacker-vacakolásokat):
-
alapértelmezésben minden gép belső hálózati IP-címe 127.0.0.1, hostnév ekkor localhost,
-
konfigurált routerünk saját DHCP-szerverén keresztül kioszthat gépünk számára egy belső hálózati IP-címet, például 192.168.0.10,
-
az Internetre való felmenetelkor a szerződött Internet-szolgáltatónk fog nekünk egy IP-címet, vele egy hostnevet kiosztani.
Olyan szoftveres rutingyűjteményt keresünk tehát a Java-rendszeren belül, amelyik az 1. és a 3. pont szerinti névfeloldást képes megoldani. A dedikált osztályunk az InetAddress lesz a java.net csomagban, a láncolt utasítássorozat végeredményét rögtön 1 egyszerű String-objektumba vezetjük:
ipNumber = java.net.InetAddress.getByName(hostName).getHostAddress();
Mivel kényes, hálózati működésről van szó, a Java-rendszer szoftvermérnökei kötelező kivételkezelést írtak elő a rutinok köré:
try{
ipNumber =
java.net.InetAddress.getByName(hostName).getHostAddress();
}catch(Exception ex){
System.out.println("Resolution is not
successful.");
}
Először ellenőrizzük le, hogy a belső hálózati IP-címünk 127.0.0.1 és ezt valóban a localhost név reprezentálja (String hostName = "localhost";):
Main.java
public class Main {
public static void main(String[] args) {
Window window = new Window();
}
}
Window.java
import javax.swing.*;
class Window extends JFrame {
Window() {
super();
String hostName = "localhost";
String ipNumber = "";
try{
ipNumber =
java.net.InetAddress.getByName(hostName).getHostAddress();
}catch(Exception ex){
System.out.println("Resolution was not successful.");
}
JFrame frame = new JFrame();
JLabel label = new JLabel();
label.setText("My IP-number is " + ipNumber);
frame.add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setVerticalAlignment(SwingConstants.CENTER);
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
A névfeloldás automatikusan működik, bár most egyértelműen a Java-rendszeren keresztül lett elindítva.
A szerződött Internet-szolgáltatónk által kiosztott IP-cím lekérdezéséhez meg kell tudnunk az általa szintén kiosztott hostnevet. Erre egy lehetőség a jelen honlap látogatásszámlálójának felhasználása (www.informatika-programozas.hu/stat.php), amely persze ebben az esetben az IP-címet is meg fogja mondani, ezért ezt már csak le kell ellenőriznünk. (A teljes kiosztott hostnevet személyi okokból nem osztom meg: String hostName = "x";.)
Main.java
public class Main {
public static void main(String[] args) {
Window window = new Window();
}
}
Window.java
import javax.swing.*;
class Window extends JFrame {
Window() {
super();
String hostName = "x";
String ipNumber = "";
try{
ipNumber =
java.net.InetAddress.getByName(hostName).getHostAddress();
}catch(Exception ex){
System.out.println("Resolution was not successful.");
}
JFrame frame = new JFrame();
JLabel label = new JLabel();
label.setText("My IP-number is " + ipNumber);
frame.add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setVerticalAlignment(SwingConstants.CENTER);
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