Objektno-orjentisano programiranje

GUI (Graphical User Interface) u Java programskom jeziku

Uvod

Aplikacije koje imaju samo tekstualni ulaz i izlaz nazivaju se konzolnim aplikacijama.
GUI (Graphical User Interface) je digitalni interfejs sa kojim korisnik interaguje preko grafičkih komponenti kao što su dugmići, meniji, polja za unos teksta, padajuće liste, …

Neki od paketa za GUI programiranje u Javi:

Ceo GUI se sastoji iz tzv. grafičkih komponenti. Grafičke komponente koje se pojavljuju na ekranu nazivaju se i kontrole ili “vidžiti“. Neke kontrole:

Svaki deo grafičkog interfejsa je implementiran kao klasa nekog GUI paketa.

Otvaranje slike

U Javi možemo učitati sliku sa neke lokacije, smestiti je u neki objekat i posle je koristiti, tako što ćemo najčešće da je postavimo na neko dugme.

// otvaranje slike
ImageIcon icon = new ImageIcon("putanja/do/slike"); // ili new ImageIcon(getClass().getResource("putanja/do/slike"))

Potrebno je obratiti pažnju na putanju do slike, jer konstruktor može da baci RuntimeException.

ImageIcon zvanična dokumentacija

Grafičke komponente

Uprošćen dijagram klasa osnovnih GUI klasa GUI Java Class Diagram

Component

Klasa Component je zajednička osnovna klasa za sve GUI kontrole i reprezentuje nešto što ima poziciju,veličinu,može se iscrtati na ekranu i prihvata ulazne događaje.
Neke metode, koje ćete koristiti na kolokvijumu:

Container

Klasa Container je izvedena iz Component. Objekti svih klasa izvedenih iz klase Container mogu da sadrže druge objekte iz bilo koje klase koja je izvedena iz klase Component. Kako Container nasleđuje Component, sledi da kontejneri mogu da sadrže druge kontejnere. Izuzetak je klasa Window i njene potklase, jer one ne mogu biti sadržane u drugom kontejneru.
Neke metode ove klase, koje čete koristiti na kolokvijumu, možete pogledati u sekciji Raspoređivanje komponenti.

Frame

Klasa Frame je izvedena iz Window. Koristi se za kreiranje glavnog prozora aplikacije. Objekat tipa Frame može da sadrži traku menija i da prikaže naslov. JFrame je swing verzija Frame klase. Samostalna GUI (swing) aplikacija, što se grafičkog dela tiče, najčešće sadrži jedan JFrame u koji se smeštaju kontrole. contentPane je Container koji zauzima centralni deo prozora i u njega se, najčešće, izuzimajući menije, smeštaju komponente (dugmići, padajuće liste itd.)

Primer kreiranje custom JFrame klase

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

public class MyFrame extends JFrame {
    public MyFrame() {
        super("Naslov"); /// ili setTitle("Naslov");
        setBounds(100, 200, 500, 600); // pocetak prozora ce biti u tacki (100, 200) u odnosu na gornji levi ugao ekrana, sirina ce biti 500 a visina 600
        setDefaultCloseOperation(EXIT_ON_CLOSE); // kada se zatvori prozor, program prekida izvrsavanje
        setVisible(true); // prozor treba biti vidljiv
    }
}

Dugmići

JButton – regularno dugme

JCheckBox – dugme sa checkbox-om sa leve strane
JRadioButton – dugmad koja operišu u grupi, tako da je samo jedno dugme pritisnuto u datom trenutku. Ovo grupisanje se postiže dodavanjem JRadioButton objekta ButtonGroup objektu

Dijalozi

Dijalog poruke

JOptionPane.showMessageDialog(null, "Poruka"); // otvara dijalog i prikazuje poruku

Da-ne dijalog

int status = JOptionPane.showConfirmDialog(null, "Poruka", "Naslov", JOptionPane.YES_NO_OPTION); // otvara Da-ne dijalog

if (status == JOptionPane.YES_OPTION) {
  // korisnik je odabrao "DA" opciju
}

if (status == JOptionPane.NO_OPTION) {
  // korisnik je odabrao "NE" opciju
}

if (status == JOptionPane.CANCEL_OPTION) {
  // korisnik je zatvorio dijalog
}

Tekst komponente

JLabel – pasivna komponenta, ne može se editovati, služi za označavanje drugih komponenti. Gorenavedene metode koje postoje u klasi JButton postoje i u klasi JLabel.
JTextField – kao JLabel samo se može editovati. Predstavlja jednu liniju teksta.
JFormattedTextField – to je JTextField komponenta koja ima kontrolu formata podataka koji se unose/prikazuju.
JTextArea – komponenta koja dozvoljava unos višelinijskog teksta. Ne podržava direktno skrolovanje, ali to se može postići stavljanjem komponente JTextArea u kontejner JScrollPane

Liste komponente

JList – definiše ograničenu listu stavki
JComboBox - dopušta korisniku da izabere jednu stavku iz padajuće liste. Zvanična dokumentacija. Tutorijal
NAPOMENA: Klasa JComboBox je generička. E je tip koji se prosleđuje kao parametar generičkoj klasi (može biti String, Object, …). Primer: new JComboBox<String>( );

Raspoređivanje komponenti

Kontejner je objekat svakog tipa koji kao osnovnu klasu ima Container klasu.
Kontejner sadrži:

  1. komponente
    Komponente unutar kontejnera se prikazuju unutar površi koju zauzima kontejner na ekranu.
    Komponente su smeštene u listu, pa imaju svoje indekse.

    • public int getComponentCount() – vraća broj komponenti u kontejneru
    • public Component getComponent(int index) – vraća komponentu koja se identifikuje datim indeksom. Radi se o indeksu niza, pa mora biti u opsegu [0, count-1].
    • public Component[] getComponents() – vraća niz komponenti iz kontejnera
    • Nekoliko verzija add() metoda – dodavanje komponete kontejneru
      • public Component add(Component c) – dodaje komponentu c na kraj liste komponenti sačuvane u kontejneru. Vraća se c.
      • public Component add(Component c, int index – komponenta se smešta na datu poziciju. Ako je index -1 komponenta se dodaje na kraj liste, u suprotnom indeks mora biti ne manji od 0 i manji od trenutnog broja komponenti u kontejneru.Vraća se c.
    • public void add(Component c, Object constraints - ograničenja specifična za menadžer postavke
    • public void add(Component c, Object constraints, int index)
  2. menadžera postavke
    Menadžer postavke je objekat neke od klasa tipa LayoutManager. On sadrži opis načina raspoređivanja komponenti u kontejneru.

    • void setLayout(LayoutManager mgr) - setuje LayoutManager-a za kontejner
    • LayoutManager getLayout()

Menadžeri postavke

Svi kontejneri imaju podrazumevani layout manager, ali se može izabrati drugačiji kada je potrebno. Layout manager određuje poziciju i veličinu svih komponenti u kontejneru.

Menadžeri:

Border Layout

Content Pane – kontejner, zauzime centralni deo prozora i na njega se dodaju ostale komponente (dugmići, polja za unos…). U zavisnosti od potrebe komponente se grupišu tako što se dodaju nekom panelu, koji ima odgovarajući raspored, a onda se paneli smeštaju u veći kontejner. JPanel predstavlja površinu na koju se mogu dodati druge komponente.

Događaji

Događaj se može shvatiti kao signal (određenog tipa) koji se šalje programu kao informacija o tome da se nešto desilo. Događaj se generiše nakon akcije koja nije desila od strane same aplikacije, kao što su akcija korisnika (pomeranje miša, klik mišem i sl) ili signal poslat od strane OS-a. Java događaje generišu izvori(sources) događaja a obrađuju objekti klasa osluškivača(listeners) događaja.

Sistem delegiranja:

Dva koraka u definisanju obrade:

  1. definisanje osluškivača
  2. registracija osluškivača kod izvora

Klase osluškivača mora da implemetira interfejs nekog osluškivača ili da proširuje neku klasu koja implementira interfejs osluškivača.

Registrovanje instance klase osluškivača događaja kod izvora:

izvorDogadjaja.addActionListener(listener); // listener je instanca klase koja implementira interfejs ActionListener
// ili
izvorDogadjaja.addMouseListener(listener); // listener je instanca klase koja implementira interfejst MouseListener

Samo komponente Button, List i TextField generišu ActionEvent. Sve komponente generišu MouseEvent.

Standardni osluškivači Listeneri

Adapteri su klase koje implementiraju interfejs osluškivača događaja, tako da programer treba da prepiše samo one metode koje su mu potrebne, kako ne bi morao da implementira sve metode.

Svi događaji poseduju metode:

Mouse listener

Interfejs osluškivača miša predviđa 5 metoda:

MouseEvent

Zvanična dokumentacija

MouseEvent fildovi

MouseEvent metode

Obrada unosa sa tastature

KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(new KeyEventDispatcher() {
  
  @Override
  public boolean dispatchKeyEvent(KeyEvent e) {
    // TODO Logika
    return false;
  }
});

KeyEvent

Zvanična dokumentacija

KeyEvent fildovi

KeyEvent metode