DIZAJN KORISNIČKOG INTERFEJSA UPOTREBOM Swing-a

Swing, koji je deo Java Foundation Class bibliteke, jeste ekstenyija Abstract Windowing Toolkit koji je integrisan u Java 1.2.

Swing pruža veću funkcionalnost—nove komponente, proširene mogućnosti starih komponenti, bolje upravljanje događajima,...

Svi elementi Swing-a su deo paketa java.awt.swing. Da bi se koristile Swing klase, mora se koristiti iskaz import sa pozivom željenih klasa ili uključiti sve klase u iskaz kao u primeru:

import java.awt.swing.*;

Swing komponente su podklase klase  JComponent.

Kostur aplikacije
Pri kreiranju jednostavne Swing aplikacije, prvi koraci su kreiranje podklase klase JFrame. Klasa JFrame je proširenje klase Frame.
 

  import java.awt.GridLayout;
  import java.awt.event.*;
  import java.awt.swing.*;
:/* import javax.swing.*; */

  public class OkvirSwing extends JFrame {
 
      public OkvirSwing() {
          super("Naslov - VIDI ME");
 
         // mesto dodavanja komponenti
     }

     public static void main(String[] args) {
         JFrame frame = new OkvirSwing();

         WindowListener l = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                 System.exit(0);
             }
         };
         frame.addWindowListener(l);

         frame.pack();
         frame.setVisible(true);
     }
 }

Dodavanje komponenti u Swing okvir

 Pri radu sa  JFrame objektima postoke razlike u odnosu na na rad sa njegovom kopijom  AWT. Umesto da dodajete kontejnere i komponente direktno u okvir, one se moraju dodati na prelazni kontejner koji se naziva pano sadržaja-content pane.

Objekat JFrame je podeljen na nekoliko različitih panoa. Glavni pano sa kojim se radi je  content pane, koji predstavlja kompletnu oblast okvira u koji će se komponente dodavati.

Postupak dodavanja komponente u  content pane:

•  kreirati JPanel objekat (Swing verzija panela).
•  dodati sve komponente (kontejnere) u JPanel upotrebom metoda add(Component).
•  napraviti od panoa JPanel content pane upotrebom metoda setContentPane(Container). JPanel objekat je jedini argument.

  import java.awt.GridLayout;
  import java.awt.event.*;
  import java.awt.swing.*;
 
  public class SwingDugme extends JFrame {
 
      public SwingDugme() {
          super("Naslov:  Swinger ");
 
         String natpis = "Mozete kliknuti na mene " +
             "i stupiti u interakciju sa mnom.";
         JButton vDugme = new JButton(natpis);

         JPanel pane = new JPanel();
         pane.add(vDugme);

         setContentPane(pane);
     }

     public static void main(String[] args) {
         JFrame frame = new SwingDugme();

         WindowListener l = new WindowAdapter() {
             public void windowClosing(WindowEvent e) {
                 System.exit(0);
             }
         };
         frame.addWindowListener(l);

         frame.pack();
         frame.setVisible(true);
     }
 }

Rad sa Swing-om

Za svaku komponentu koja je obrađena u Abstract Windowing Toolkit-u, postoji odgovarajuća Swing komponenta.

Labele
Labele su implementirane u Swing upotrebom klase JLabel.
Konstruktor metodi:
•  JLabel(String, int) natpis sa tekstom i poravnanjem koje je definisano jednom od tri specifikacije iz klase SwingConstants: LEFT, CENTER, RIGHT
•  JLabel(String, Icon, int) natpis sa tekstom, ikonom i poravnanjem

Dugmad
Za Swing dugme korisri se klasa  JButton.

Konstruktor metodi
•  JButton(String)
•  JButton(Icon)
•  JButton(String, Icon)

Tekst polja
Tekst polja su implementirana u Swing klasom  JTextField. Razlika između ovih tekst polja i njihovih  AWT parnjaka je što metod za ispis skrivenog unosa teksta, setEchoChar(char), nije podržan u klasi JTextField.

Konstruktor metodi:

•  JTextField(int) tekst polje specificirane širine.
•  JTextField(String, int) tekst polje koji sadrži dati tekst i ima specificiranu širinu

Klasa JPasswordField se koristi za kreiranje tekst polja koja koriste karaktere za skrivanje unosa. Ova klasa poseduje konstruktor metode kao i JTextField: JPasswordField(int) i JPasswordField(String, int).
 

Tekst oblasti
Tekst oblasti su implementirane u Swing klasom JTextArea.

Konstruktor metodi:
•  JTextArea(int, int)  tekst oblast sa navedenim brojem redova i kolona
•  JTextArea(String, int, int) tekst oblast sa navedenim tekstom, brojem redova i kolona

Polja za potvrdu i radi dugmad (Check Boxes/Radio Buttons)
Klasa JCheckBox je implementacija za check box-ove u Swing-u. Funkcionalnost je ista kao kod AWT sem čto sadrže i ikone kao obeležje.

Konstruktor metodi
•  JCheckBox(String) check box sa navedenim tekst natpisom
•  JCheckBox(String, boolean) check box sa navedenim tekst natpisom koji je aktiviran ako je drugi argument true
•  JCheckBox(Icon) check box koji sadrži navedenu ikonu
•  JCheckBox(Icon, boolean) check box koji sadrži navedenu ikonu i koji je aktivirana ako je drugi argument true
•  JCheckBox(String, Icon) check box koji sadrži navedeni tekst i  ikonu
•  JCheckBox(String, Icon, boolean) check box koji sadrži navedeni tekst i  ikonu koji su aktivirani ako treći argument je true

Check box grupe su implementirane u Swingupotrebom klase ButtonGroup.

Radio dugmad su implementirana u  Swing posredstvom klase JRadioButton. Konstruktor metode su iste kaoi u slučaju klase JCheckBox .
 

Liste izbora
Liste izbora koje su bile kreirane u AWT-u upotrebom klase Choice, su prisutne posredstvom klase JComboBox.

Koraci pri kreiranju
1.  Konstruktor JComboBox() se koristi bez argumenata.
2.  Metod polja za potvrdu addItem(Object) se koristi da bi se dodale stavke na listi.
3.  Metod polja za potvrdu setEditable(boolean) se koristi sa argumentom false.

Trake za pomeranke teksta - Scrollbars
Scrollbarsi su  implementirane u  Swing putem klase JScrollBar.

Konstruktor metodi:
•  JScrollBar(int) scrollbar sa navedenom  orientacijom.
•  JScrollBar(int, int, int, int, int) scrollbar sa navedenom orientacijom, početnom vrednosti, scroll box veličinom, minimalnom vrednošću,  maximalnom vrednošću.
Orijentacija je indicirana promenljivima klase SwingConstant  HORIZONTAL ili VERTICAL.

Primer prevoda apleta rgb2hsb sa prethodnog časa u aplikaciju (zapravo kostur bez metoda za upravljanje događajem koji će uskoro biti dodat)

 import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingRGB2HSB extends JFrame {
    SwingColorControls RGBcontrols, HSBcontrols;
    JPanel swatch;

    public SwingRGB2HSB() {
        super("Konverzija");

        JPanel pane = new JPanel();
        pane.setLayout(new GridLayout(1, 3, 5, 15));
        swatch = new JPanel();
        swatch.setBackground(Color.black);
        RGBcontrols = new SwingColorControls(this, "Crvena",
            "Zelena", "plava");
        HSBcontrols = new SwingColorControls(this, "Hue",
            "Saturation", "Brightness");
        pane.add(swatch);
        pane.add(RGBcontrols);
        pane.add(HSBcontrols);

        setContentPane(pane);
    }

    public static void main(String[] args) {
        JFrame frame = new SwingRGB2HSB();

        WindowListener l = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        };
        frame.addWindowListener(l);

        frame.pack();
        frame.setVisible(true);
    }

    public Insets getInsets() {
        return new Insets(10, 10, 10, 10);
    }
}

class SwingColorControls extends JPanel {
    SwingRGB2HSB frame;
    JTextField tfield1, tfield2, tfield3;

    SwingColorControls(SwingColorTest parent,
        String l1, String l2, String l3) {

        frame = parent;
        setLayout(new GridLayout(3,2,10,10));
        tfield1 = new JTextField("0");
        tfield2 = new JTextField("0");
        tfield3 = new JTextField("0");
        add(new JLabel(l1, JLabel.RIGHT));
        add(tfield1);
        add(new JLabel(l2, JLabel.RIGHT));
        add(tfield2);
        add(new JLabel(l3, JLabel.RIGHT));
        add(tfield3);
    }

    public Insets getInsets() {
        return new Insets(10, 10, 0, 0);
    }
}
 

Mnemonici tastature

Mnemonici tastature se postavljaju metodom  setMnemonic(char) nad komponentom gde se mnemonik koristi za kontrolu.

Na primer Alt +I ce altivirati  dugme Info

JButton infoButton = new JButton("Info");
infoButton.setMnemonic('i');
 

Oblačići - ToolTips

ToolTip se  kao komponente postavljaju pozivom metoda setToolTipText(String) nad ciljnom komponentom.

Primer kreiranja JScrollBar komponente i pridruživanje njenog oblačića.

JScrollBar slika = new JScrollBar();
slika.setToolTipText("Pomerite traku radi pomeranja slike");

Standardni dijalog boxovi
Klasa JOptionPane pruža nekolikometoda za kreiranje standardnih dijalog boxova.

Postoje četiri standard dialog boksova:

•  ConfirmDialog  pitanje i  Yes, No, Cancel odgovori.
•  InputDialog  upit i tekstualni unos.
•  MessageDialog prikaz poruke.
•  OptionDialog kombinacija prethodna tri tipa dijalog box-ova.

Confirm Dialog Boxes

Primer koji koristi ovaj tip dijalog box-a i smesta odgovor u promenljivu odgovor:

int odgovor;
odgovor = JOptionPane.showConfirmDialog(null,
    "Da li ste za formatiranje diska?");

Primer broj 2:

int odgovor = JOptionPane.showConfirmDialog(null,
            "Da li ste za formatiranje diska?",
            "Naslov u naslovnoj traci dijalog box-a",
            JOptionPane.YES_NO_OPTION,
            JOptionPane.ERROR_MESSAGE);

Input Dialog Boxes

Metod za kreiranje
showInputDialog(Component, Object)
 Argumenti su: komponenta roditelja i string/komponenta/ikona prikazani u box-u.
 

String odgovor = JOptionPane.showInputDialog(null,
    "Kako se zovete:");

Metod za kreiranje
showInputDialog(Component, Object, String, int)
Prva dva su kao u prethodnom slučaju, a ostala dva su
tekst u naslovnoj traci i jedna od pet promenljivih klase koja opisuje tip dijalog boxa: ERROR_MESSAGE, INFORMATION_MESSAGE, PLAIN_MESSAGE, QUESTION_MESSAGE, ili WARNING_MESSAGE.

String odgovor = JOptionPane.showInputDialog(null,
    "Unesite JMBG broj?",
    "Unos",
    JOptionPane.QUESTION_MESSAGE);

Message Dialog Boxes

Metod za kreiranje
 showMessageDialog(Component, Object)
 

Za razliku od drugih dialog boxova, message dialog boxes ne vraća nikakvu korisnu vrednost kao odgovor.
Primer MDB za poruke:

JOptionPane.showMessageDialog(null,
    "Obrisana datoteka.");

Metod z akreiranje
showMessageDialog (Component, Object, String, int)
Upotreba je ista kao kod metoda showInputDialog() sa istim argumentima, sem što showMessageDialog() ne vraća vrednost.

Primer:
String response = JOptionPane.showMessageDialog(null,
    "Obrisana datoteka.",
    " Alert no 2",
    JOptionPane.WARNING_MESSAGE);

Opcioni Dijalog Boxovi

Metod za kreiranje
 showOptionDialog(Component, Object, String, int, int, Icon, Object[], Object) method.

Argumenti metoda:

•  roditeljska komponenta dijaloga
•  tekst, ikona, ili komponenta koja se prikazuje
•  string koji se prikazuje u traci za naslov dijalog box-a
•   tip dijalog boxa definisan promenljivama klase  YES_NO_OPTION, YES_NO_CANCEL_OPTION, odnosno broj 0 ukoliko ne treba niti jedno dugme
•  ikona koju treba prikazati upotrebom promenljivih  ERROR_MESSAGE, INFORMATION_MESSAGE, PLAIN_MESSAGE, QUESTION_MESSAGE, WARNING_MESSAGE, odnosno broj 0 ako niti jedna od ovih ikona ne treba da bude prikazana
•  objekat Icon koji će biti prikazan umesto neke od ikona u prethodnom argumentu
•  niz objekata koji sadrži komponenete odnosno druge objekte koji predstavljaju izbore u okviru dijalog boksa ukoliko se ne koriste YES_NO_OPTION i YES_NO_CANCEL_OPTION
• objekt koji predstavlja podrazumevanu selekciju ako se ne koriste opcije YES_NO_OPTION i YES_NO_CANCEL

Primer kreiranja opcionog dijalog box-a koji koristi niz objekata JButton za opcije u boksu i element pol[2] kao podrazumevanu selekciju:

JButton[] pol = new JButton[3];
pol[0] = new JButton("Muski");
pol[1] = new JButton("Zenski");
pol[2] = new JButton("bespolan");
int response = JOptionPane.showOptionDialog(null,
    "Pol?,
    "Pol dijalog",
    0,
    JOptionPane.INFORMATION_MESSAGE,
    null,
    pol,
    pol[2]);

Primer koji prikazuje više dijalog boxova. Nakon prihvatanja korisnkovog unosa, one se čuvaju u tekst polja glavnog prozora.
 

 1: import java.awt.GridLayout;
 2: import java.awt.event.*;
 3: import java.awt.swing.*;
 4:
 5: public class Info extends JFrame {
 6:     private JLabel titleLabel = new JLabel("Title: ",
 7:         SwingConstants.RIGHT);
 8:     private JTextField title;
 9:     private JLabel addressLabel = new JLabel("Address: ",
10:         SwingConstants.RIGHT);
11:     private JTextField address;
12:     private JLabel typeLabel = new JLabel("Type: ",
13:         SwingConstants.RIGHT);
14:     private JTextField type;
15:
16:     public Info() {
17:         super("Site Information");
18:
19:         // naziv sajta
20:         String response1 =JOptionPane.showInputDialog(null,
21:             "Naslov sajta je:");
22:         title = new JTextField(response1, 20);
23:
24:         // unos URL-a i prikaz
25:         String response2 =JOptionPane.showInputDialog(null,
26:             "URL sajta:");
27:         address = new JTextField(response2, 20);
28:
29:         // tip sajta
30:         String[] choices = { "PrivatnoLice", "Organizacija", "Razno" };
31:         int response3 = JOptionPane.showOptionDialog(null,
32:             "Koji je tip sajta?",
33:             "Site Type",
34:             0,
35:             JOptionPane.QUESTION_MESSAGE,
36:             null,
37:             choices,
38:             choices[0]);
39:         type = new JTextField(choices[response3], 20);
40:
41:         JPanel pane = new JPanel();
42:         pane.setLayout(new GridLayout(3, 2));
43:         pane.add(titleLabel);
44:         pane.add(title);
45:         pane.add(addressLabel);
46:         pane.add(address);
47:         pane.add(typeLabel);
48:         pane.add(type);
49:
50:         setContentPane(pane);
51:     }
52:
53:     public static void main(String[] args) {
54:         try {
55:             UIManager.setLookAndFeel(
56:                 UIManager.getSystemLookAndFeelClassName());
57:         } catch (Exception e) {
58:             System.err.println("Upozorenje"
59:                              + "look and feel: " + e);
60:         }
61:
62:         JFrame frame = new Info();
63:
64:         WindowListener l = new WindowAdapter() {
65:             public void windowClosing(WindowEvent e) {
66:                 System.exit(0);
67:             }
68:         };
69:         frame.addWindowListener(l);
70:
71:         frame.pack();
72:         frame.setVisible(true);
73:     }
74: }