Grafikus felület építésére a Java SE keretein belül az AWT, java.awt.* és a Swing javax.swing.* csomagok szolgálnak. Az előbbi a kezdetek óta része a Javanak, az utóbbi a Java 1.3-tól része a JDK-nak, azaz a Java 2 platform 1.3 verziójától.
A Java ME, MIDP keretein belül sem az AWT, sem a Swing csomag nem elérhető, a mobilokon a grafikus felület felépítésére a javax.microedition.lcdui.* csomag használandó. Ennek a csomagnak a bevezetését a Java a mobiltelefonokban: MIDlet objektumok - Labirintus MIDlet című pont alatt tárgyaljuk.
Az AWT programozása egyszerűbb, de az AWT-vel felépített felület kinézete platformfüggő. A Swing programozása - a párhuzamosság, azaz a szálkezelés - miatt némileg bonyolultabb. A kézikönyvben számos AWT-s felületű példát találunk, ilyenek például a Galton deszka kísérlet, a Sejtautomata szimuláció programja vagy például a Mandelbrot halmaz programja című pontokban fejlesztett osztályok. Ebben a pontban Swinges példákat fogunk fejleszteni.
A Java felületépítés erőssége, hogy nem kell pixel pontossággal megterveznünk a grafikus felület kinézetét - például egy nyomógomb komponens méretét, helyzetét -, hanem mindenféle elhelyezési stratégiát követhetünk, amik helyettünk meghatározzák a komponensek pontos elhelyezést. Kellemes ez, ha arra gondolunk, hogy programunk ablakának természetes tulajdonsága az átméretezhetősége. Mi mégis egy olyan példával indítunk most, ahol nem használunk elhelyezési stratégiát, hanem magunk írjuk elő a használt komponensek méretét és helyzetét. Ezt azért is tehetjük meg bátran, mert az integrált fejlesztői környezetek, mint például az általunk használni javasolt NetBeans is, hatékony támogatást adnak a felület egérrel történő összehúzogatására, miközben eleve azt a felületet látjuk, amit építünk éppen. Ezért térünk most vissza az ősi módszerhez: négyzethálós, matekfüzet lapján tervezzük meg a felületet. Egy ilyen skiccet mutatunk a következő ábrán, a korábban, a Kizáró vagyos titkosítás című pontban tárgyalt exor titkosítást megvalósító programunkat látjuk most el grafikus felülettel.

public class ExorTitkositoGUI extends javax.swing.JFrame {
public ExorTitkositoGUI() {
// Az ablak adatai, fejléce:
super("Javat tanitok példa");
// az ablakot ne lehessen átméretezni, mert
setResizable(false);
// nem használunk elhelyezési stratégiát (hanem majd mi mondjuk meg,
// melyik komponens melyik pozíción és mekkora legyen).
getContentPane().setLayout(null);
// az ablak mérete
setBounds(100, 50, 210, 250);
// az ablak szokásos bezár gombjára kilép a program:
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
// a titkosító kulcs szövegmezője
final javax.swing.JTextField kulcsTextField
= new javax.swing.JTextField();
kulcsTextField.setText("kulcs");
kulcsTextField.setBounds(5, 5, 130, 20);
kulcsTextField.setToolTipText("Titkosító kulcs");
getContentPane().add(kulcsTextField);
// a tiszta szöveg doboza
final javax.swing.JTextArea tisztaTextArea
= new javax.swing.JTextArea();
javax.swing.JScrollPane tisztaScrollPane
= new javax.swing.JScrollPane();
tisztaScrollPane.setViewportView(tisztaTextArea);
tisztaScrollPane.setBounds(5, 30, 190, 80);
tisztaScrollPane.setToolTipText("A kódolandó/dekódolandó szöveget írd ide!");
getContentPane().add(tisztaScrollPane);
// a titkos szöveg doboza
final javax.swing.JTextArea titkosTextArea
= new javax.swing.JTextArea();
javax.swing.JScrollPane titkosScrollPane
= new javax.swing.JScrollPane();
titkosScrollPane.setViewportView(titkosTextArea);
titkosScrollPane.setBounds(5, 125, 190, 80);
titkosScrollPane.setToolTipText("Itt kapod az eredményt.");
getContentPane().add(titkosScrollPane);
// a kódoló/dekódoló gomb
javax.swing.JButton kódolButton
= new javax.swing.JButton();
kódolButton.setText("K/D");
kódolButton.setBounds(140, 5, 55, 20);
kódolButton.setToolTipText("Kódolás/Dekódolás");
kódolButton.addActionListener(
new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent
e) {
byte [] kulcs = kulcsTextField.getText().getBytes();
byte [] buffer = tisztaTextArea.getText().getBytes();
int kulcsIndex = 0;
for(int i=0; i<buffer.length; ++i) {
buffer[i] = (byte)(buffer[i] ^ kulcs[kulcsIndex]);
kulcsIndex = (kulcsIndex+1) % kulcs.length;
}
System.out.println(new String(buffer));
titkosTextArea.setText(new String(buffer));
}
});
getContentPane().add(kódolButton);
// Lássuk!
setVisible(true);
}
public static void main(String [] args) {
new ExorTitkositoGUI();
}
}
Az exor titkosítós, immár grafikus köntösbe öltöztetett példánk kódol.

A kódolt szöveget visszamásoltuk a tiszta szöveg dobozába, majd újra kódolva dekódoltuk.

A Swinges programozási tapasztalatainkat a Genomi, aminosav vagy akár tetszőleges szekvenciák összehasonlítása című pont tanulmányozásával növelhetjük, ahol egy menüsorral is felszerelt felületű programot írunk. Továbbá rámutatunk a Swing programozásban leginkább szem előtt tartandó programozási gyakorlatra, miszerint ne csináltassunk időigényes dolgokat az eseménykezelőkben, mert ez a felület lefagyását okozhatja. Mivel az eseménykezelést és a megjelenítést ugyanaz a programszál végzi, így ha az eseménykezelőt egy hosszadalmas számítással blokkoljuk, akkor ezzel egyben a felület megjelenítését is blokkoljuk! (Amit tipikusan a program lefagyásaként szoktunk értékelni.)

Előző
Előző