A Kempelen Farkas Digitális Tankönyvtár/vagy más megjelenítő által közvetített digitális tartalmat a felhasználó a szerzői jogról szóló 1999. évi LXXVI. tv. 33. paragrafus (4) bekezdésében meghatározott oktatási, illetve tudományos kutatási célra használhatja fel. A felhasználó a digitális tartalmat képernyőn megjelenítheti, letöltheti, arról elektronikus adathordozóra vagy papíralapon másolatot készíthet, adatrögzítő rendszerében tárolhatja. A Kempelen Farkas Digitális Tankönyvtár/vagy más megjelenítő weblapján található digitális tartalmak üzletszerű felhasználása tilos, valamint kizárt a digitális tartalom módosítása és átdolgozása, illetve az ilyen módon keletkezett származékos anyag további felhasználása.

1.2.1. Bepillantás a GUI programozásba

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.

Az exor titkósító felületének terve.

                        
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.

Az exor titkósító kódol.

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

Az exor titkósító dekódol.

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.)