Gyakorlati alapok IV.
Végre ablakozunk! (AWT, Swing, JavaFX)
Hiperhivatkozás (hyperlink)
A hiperhivatkozás (hyperlink) objektumot jól ismerjük a
webböngészőkből: segítségével közvetlenül tudunk ugrálni weboldalak között.
Forrás - Source: www.volusion.com
Természetesen a Java-nyelv is
implementálta, bár az egyszerű HTML-nyelvnél kissé bonyolultabb módon.
Hyperlink-objektumot legegyszerűbben
JLabel()
tulajdonságokkal rendelkező objektumként hozhatunk létre. Ekkor a
Jlabel-re jellemző összes metódushoz
hozzáférhetünk, az objektumot létrehozhatjuk, inicializálhatjuk,
konfigurálhatjuk:
JLabel hyperlink = new JLabel();
hyperlink.setText("Visit my website!");
hyperlink.setForeground(Color.RED.darker());
hyperlink.setCursor(new Cursor(Cursor.HAND_CURSOR));
hyperlink.setFont(new Font("Serif", Font.PLAIN, 30));
hyperlink.setBounds(90, 25, 210, 100);
A hyperlink működéséhez azonban ennyi nem elég, hiszen emlékezzünk
vissza: a hyperlink egyrészt tartalmazza a céloldal URL-címét (például
http://www.informatika-programozas.hu), másrészt a kurzor a hyperlink
fölé mozgatásával virtuális kesztyűvé vagy más alakzattá konvertálódik, amely
egérkattintás hatására ugrást biztosít a megadott weboldal felé (azaz letölti
azt az alapértelmezett böngészőbe).
Teljesen nyilvánvaló, hogy ez egy újabb, lekezelendő egéresemény.
Aktiválásához először hozzá kell adnunk a hyperlink-objektumhoz az
eseményfigyelést...
hyperlink.addMouseListener(new MouseAdapter()
...majd le kell kezelnünk a lehetséges egéreseményeket. Ezek lehetnek:
-
mouseClicked() - ha rákattintunk a hyperlink-objektumra,
-
mouseEntered() - ha a kurzorral belépünk a hyperlink-objektum területére,
-
mouseExited() - ha a kurzorral elhagyjuk a hyperlink-objektum területét.
Itt jegyezzük meg, hogy a fenti 3
esemény közül a legfontosabb a mouseClicked(). A
másik 2 eseményt akár üresen is hagyhatjuk. Ez a
mouseClicked() metódus nagyon kényes és veszélyes feladatot lát el: a
Desktop.getDesktop().browse(new URI("URL-cím"))
függvény meghívásával “kinyúl” az operációs rendszerbe és a megadott
URL-címmel aktiválva meghívja az alapértelmezett böngészőt. Ezen mozdulat
veszélyessége okán kötelező a rutint
try-catch
blokkba tennünk. A lehetséges kivételeket pedig hibaüzenetes ablakkal
jutalmazhatjuk:
JOptionPane.showMessageDialog(frame, "Connection was not
successful!");
Az alábbi kódrészletben mindezeket tanulmányozhatjuk azzal a kis különbséggel,
hogy lekezeltem a másik 2 egéreseményt is. Ezeknek bődületes hatásuk nem lesz
a futásra, de legalább látjuk őket működés közben:
hyperlink.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
Desktop.getDesktop().browse(new URI("http://www.informatika-programozas.hu"));
} catch (Exception ex) {
JOptionPane.showMessageDialog(frame, "Connection was not
successful!");
}
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("Mouse exited.");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse entered.");
}
});
Nincs más dolgunk, mint a fenti rutinokra egy minialkalmazást gyártani. Az
alábbi implementáció a fent ismertetett funkciókat fogja teljesíteni. 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 java.awt.*;
import java.awt.HeadlessException;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URI;
import javax.swing.*;
public class Window extends JFrame {
public Window() throws HeadlessException {
JFrame frame = new JFrame();
JLabel hyperlink = new JLabel();
hyperlink.setText("Visit my website!");
hyperlink.setForeground(Color.RED.darker());
hyperlink.setCursor(new Cursor(Cursor.HAND_CURSOR));
hyperlink.setFont(new Font("Serif", Font.PLAIN, 30));
hyperlink.setBounds(90, 25, 210, 100);
hyperlink.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
Desktop.getDesktop().browse(new
URI("http://www.informatika-programozas.hu"));
} catch (Exception ex) {
JOptionPane.showMessageDialog(frame,
"Connection was not successful!");
}
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("Mouse exited.");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse entered.");
}
});
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/):
Az aktív területre kattintás hatására előugrik honlapom kezdőfejezete
Ugyanakkor fontos észrevennünk, hogy a hyperlink érvényességi területe
(tehát az, amelyben a virtuális kesztyű aktiválódik) a
hyperlink.setBounds(90, 25, 210, 100) függvényben beállított terület.
Ha ezt valamilyen módon nem konfiguráljuk be, akkor az egész
frame “hiperaktív” lesz.