Skip to content

Latest commit

 

History

History
339 lines (249 loc) · 23.6 KB

gui.md

File metadata and controls

339 lines (249 loc) · 23.6 KB

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:

  • java.awt
  • javax.swing
  • javafx (ovaj paket se ne koristi na vežbama i neće biti potreban za kolokvijum)

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:

  • ekranski tasteri (button)
  • radio-dugmad (radio-button)
  • polja za potvrde (checkbox)
  • klizači(scrollbar)
  • polja za tekst (text box)
  • liste (list)
  • padajuće liste (combo-box, choice)

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:

  • public add - pogledati Raspoređivanje komponenti
  • public Color getBackground() - geter za pozadinu komponente
  • public void setBackground(Color c) - seter za pozadinu komponente
  • public void setBounds(int x, int y, int width, int height) - pocetak prozora ce biti u tacki (x, y) u odnosu na gornji levi ugao ekrana, sirina ce biti width a visina height
  • public void setBounds(Rectangle r) - svi gorenavedine parametri su "upakovani" u instancu klase Rectangle
  • public void setVisible(boolean b) - prikazuje ili sakriva komponentu
  • public void setSize(int width, int height) - setuje veličinu
  • public void setPreferredSize(int width, int height) - setuje željenu (najčešće minimalnu) veličinu

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

  • public void pack() - Ova metoda prilagođava veličinu prozora (Window) tako da odgovara njegovom sadržaju. Na primer, ako imate prozor sa sadržajem koji se dinamički menja, pozivanjem pack() će automatski prilagoditi veličinu prozora kako bi se sve komponente sadržaja mogle videti bez potrebe za scroll trakama.

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

  • Neke metode, koje ćete koristiti na kolokvijumu:

    • public String getText() - geter za tekst koji je postavljen na dugme
    • public void setText() - seter tekst dugmeta
    • public Icon getIcon() - geter za ikonicu koja je postaljena na dugme
    • public void setIcon(Icon icon) - seter za ikonicu koja se postavlja na 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>( );

  • Neke metode, koje ćete koristiti na kolokvijumu:
    • public void addItem(E item) - dodavanje stavke koju korisnik može da izabere u combo box
    • public E getItemAt(int index) - vraća stavku koja se nalazi na indeksu index. Indeksi kreću od 0.
    • public int getItemCount() - broj stavki u combo box listi
    • public int getMaximumRowCount() - maksimalan broj stavki koji se može videti u listi bez skrolovanja
    • public int getSelectedIndex() - indeks selektovane stavke
    • public Object getSelectedItem() - odabrana stavka
    • public void insertItemAt(E item, int index) - ubaci element na određeni indeks
    • public void removeAllItems() - ukloni sve stavke
    • public void removeItemAt(int anIndex) - uklanja stavku na indeksu anIndex
    • protected void selectedItemChanged() - metoda koja se poziva kada korisnik promeni odabranu stavku
    • public void setEditable(boolean aFlag) - podešava da li korisnik može ručno da unese vrednost ili ne
    • public void setEnabled(boolean b) - podešava da li korisnik može da izabere drugu vrednost ili ne
    • public void setMaximumRowCount(int count) - setuje maksimalan broj stavki koje korisnik može videti u listi bez skrolovanja
    • public void setSelectedIndex(int anIndex) - setuje indeks selektovane stavke
    • public void setSelectedItem(Object anObject) - setuje selektovanu stavku

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:

  • FlowLayout – dodaju se komponente u sukcesivnim redovima – kad je red popunjen, počinje se sa novim; podrazumevan za JPanel. Moguće je promeniti poravnanje FlowLayout-a sa setAligment(FlowLayout.<TipPoravananja>). Podrayumevano poravnanje je CENTER.

  • BorderLayout – prozor je podeljen na 5 delova – north, south, east, west, center; podrazumevani za contentPane u JFrame-u, JDialog, JApplet. Ograničenja koja mogu biti korišćenja prilikom dodavanja komponenti su:

    • BorderLayout.NORTH
    • BorderLazout.SOUTH
    • BorderLayout.EAST
    • BorderLayout.WEST
    • BorderLayout.CENTER

Border Layout

  • GridLayout – komponente se raspoređuju u pravougaonu mrežu, pri čemu korisnik zadaje broj redova i kolona

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:

  • Izvori događaja (npr. dugme) generišu objekat tipa događaj i šalju osluškivačima
  • Svaki izvor događaja održava/ima sopstvenu listu osluškivača, za svaku vrstu događaja posebnu listu
  • Da bi se neki osluškivač našao u listi nekog izvora mora se registrovati kod izvora
  • Ovakav model obrade događaja se naziva delegiranje ili prosleđivanje(pravo obrade događaja se delegira svakom objektu koji implementira interfejs odgovarajućeg osluškivača)

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:

  • public int getID() - vraća tip događaja
  • public Object getSource() - vraća izvor događaja

Mouse listener

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

  • public void mouseClicked(MouseEvent d); //pritisnuto i otpušteno dugme. pozicija miša nije pomerena van dugmeta.
  • public void mouseEntered(MouseEvent d); //kursor ušao u polje komponente
  • public void mouseExited(MouseEvent d); //kursor izašao iz polja komponente
  • public void mousePressed(MouseEvent d); //pritisnuto dugme
  • public void mouseReleased(MouseEvent d); //otpušteno dugme

MouseEvent

Zvanična dokumentacija

MouseEvent fildovi

  • public static int BUTTON1 - levi klik
  • public static int BUTTON2 - klik na scroll
  • public static int BUTTON3 - desni klik

MouseEvent metode

  • public int getButton() - da li je korisnik koristio levi klik, desni klik ili klik na scroll
  • public Point getLocationOnScreen() - x i y koordinate na ekranu
  • public Point getPoint() - x i y koordinate relativne u odnosu na izvor događaja

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

  • public static int VK_1 - dugme 1
  • public static int VK_A - dugme A
  • ...

KeyEvent metode

  • public char getKeyChar() - ako korisnik pritisne dugme "A", vratiće "A". ako pritisne "1", vratice "1", ...
  • public int getKeyCode() - vratiće KeyEvent.VK_1 ili KeyEvent.VK_A ili ...