Java - Uvod u Swing


Kreiranje prvog Swing projekta

GUI (Graphical User Interface) je grafički korisnički interfejs za rukovanje nekom aplikacijom. Kada je reč o korisnicima, ovaj interfejs se manifestuje kroz razne kontrole. S druge strane, ove kontrole omogućavaju programeru da obezbjedi korisniku ulaz u program, kao i da kontrolišu tok programske logike. Sa korisničkog aspekta, ovo je osnovni i najčešće jedini način za komunikaciju sa aplikacijom. Java Foundation Classes (JFC) predstavlja osnovni grafički okvir (framework) za kreiranje aplikacija sa grafičkim korisničkim okruženjem. JFC čine AWT, Swing i Java 2D.



JFrame

U nastavku ove lekcije biće prikazan način na koji je moguće prikazati jedan JFrame prozor i manipulisati njime. Ovo je, naravno, moguće postići i pomoću NetBeans dizajnera, a to će biti prikazano u jednoj od narednih lekcija. Prvo je potrebno kreirati jedan projekat, kao i svaki put do sada.




Nakon uspešnog kreiranja projekta u okviru main metoda glavne klase napisaćemo sledeći kod:

import javax.swing.JFrame;

public class Main {

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

Ovom linijom koda kreirali smo objekat klase JFrame, koji predstavlja glavni prozor Swing grafičkog korisničkog okruženja, ali se ništa ne prikazuje, jer nismo pozvali njegovu metodu frame.setVisible(true); kao što je prikazano u nastavku:

import javax.swing.JFrame;

public class Main {

    public static void main(String[] args) {
       JFrame frame = new JFrame();
       frame.setVisible(true);
    }
}

Prikaz koda iz gornjeg primjera izgledaće ovako:



Kao što vidimo naš JFrame okvir je minimalne veličine i ukoliko pokušamo da zatvorimo prikazani prozor, možemo da primjetimo da će se prozor zatvoriti, ali da će naš projekat i dalje biti aktivan u pozadini. Da bi se ovaj problem riješio, potrebno je postaviti još jedno svojstvo, i to pomoću setter metode setDefaultCloseOperation(). Takođe ćemo promjeniti i veličinu prozora. Pogledajmo sljedeći kod:

import javax.swing.JFrame;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

public class Main{

    public static void main(String[] args) {
       JFrame frame = new JFrame();
       frame.setSize(600, 400); // Veličina našeg JFrame prozora
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); // Zatvaranje projekta klikom na X
       frame.setVisible(true);
    }
}

Prikaz koda iz gornjeg primjera izgledaće ovako:



Konstruktor klase JFrame

JFrame, pored podrazumjevanog konstruktora, ima još tri konstruktora. Prvi podrazumeva jedan parametar tipa String. Ovaj parametar će predstavljati naslov u zaglavlju prozora:

import javax.swing.JFrame;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

public class Main{

    public static void main(String[] args) {
       JFrame frame = new JFrame("Moja prva Swing aplikacija");
       frame.setSize(600, 400);
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
       frame.setVisible(true);
    }
}

Prikaz koda iz gornjeg primjera izgledaće ovako:



Drugi konstruktor prihvata parametar tipa GraphicsConfiguration i omogućava emitovanje prozora unutar specifičnog grafičkog konteksta (drugi monitor i slično):

import java.awt.GraphicsEnvironment;
import javax.swing.JFrame;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

public class Main{

    public static void main(String[] args) {
       JFrame frame = new JFrame(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDefaultConfiguration());
       frame.setSize(600, 400);
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
       frame.setVisible(true);
    }
}

Treći konstruktor prihvata oba gore navedena parametra:

import java.awt.GraphicsEnvironment;
import javax.swing.JFrame;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

public class Main{

    public static void main(String[] args) {
       JFrame frame = new JFrame("Moja prva Swing aplikacija", GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDefaultConfiguration());
       frame.setSize(600, 400);
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
       frame.setVisible(true);
    }
}


Pozicioniranje

JFrame se pojavljuje na koordinatama 0,0 u odnosu na svoj roditeljski kontejner. Kada je taj kontejner sam operativni sistem (odnosno, kada je instanca JFrame klase osnovni prozor aplikacije), onda će se prozor pojaviti u gornjem levom uglu sistema. Pregled i modifikacija pozicije vrše se metodama setLocation() i getLocation(). Unutar klase lokacija prozora se čuva u cjelobrojnim poljima x i y. Kada te vrijednosti želimo da promenimo, koristimo setter metod setLocation(). Ovaj metod može prihvatiti samo cjeli broj, jer se lokacija izražava u pikselima (tačkama na ekranu). Takođe, metoda setLocation() postoji i u varijanti, tako da prihvata objekat tipa Point. Lokaciju prozora moguće je podesiti na dva načina:

import javax.swing.JFrame;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

public class Main{

    public static void main(String[] args) {
       JFrame frame = new JFrame("Moja prva Swing aplikacija");
       frame.setSize(600, 400);
       frame.setLocation(100, 200);
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
       frame.setVisible(true);
    }
}

ili ukoliko želite da centrirate prozor tačno na sredinu ekrana unesite sljedeći kod (podebljani kod):

import javax.swing.JFrame;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

public class Main{

    public static void main(String[] args) {
       JFrame frame = new JFrame("Moja prva Swing aplikacija");
       frame.setSize(600, 400);
       frame.setLocationRelativeTo(null);
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
       frame.setVisible(true);
    }
}


Rukovanje komponentama i Layout Manager

Za JFrame, kao i za sve ostale komponente, važi pravilo da se „deca“ dodaju komponenti metodom add(), a uklanjaju metodom remove(). Sljedeći primjer dodaje taster sa tekstom Pozdrav na postojeći Frame:

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

public class Main{

    public static void main(String[] args) {
       JFrame frame = new JFrame("Moja prva Swing aplikacija");
       frame.setLayout(new FlowLayout()); // Omogućava da dugme ne zauzima kompletan JFrame
       
       JButton button = new JButton("Pozdrav"); // Kreiranje dugmeta
       frame.add(button);
       
       frame.setSize(600, 400); 
       frame.setLocationRelativeTo(null);
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
       frame.setVisible(true);
    }
}

Prikaz koda iz gornjeg primjera izgledaće ovako:




O Layout Managerima specifičnim za Swing detaljnije ćete naučiti u narednim lekcijama.



Nasljeđivanje JFrame klase

JFrame ćemo rijetko koristiti u prikazanom obliku, a mnogo češće kao šablon za sopstvenu klasu. Tako da ćemo većinu svojstava ovog objekta postavljati unutar konstruktora njegove klase. Obično se unutar konstruktora poziva poseban metod – initComponents(), ili samo init(), koji vrši podešavanja aktuelnog objekta. Unutar ove klase svim podešavanjima (metodama i svojstvima) se obraćamo putem ključne reči this. Kreirajte novu klasu i nazovite je MyFrame kao što je prikazano na sljedećoj slici:




Sljedeći kod smjeste unutar vaše MyFrame klase:

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

public class MyFrame extends JFrame{
    
    public MyFrame(){
        initComponents();
    }
    
    private void initComponents(){
       this.setLayout(new FlowLayout()); 
       
       JButton button = new JButton("Dugme"); 
       this.add(button);
       
       this.setSize(600, 400); 
       this.setLocationRelativeTo(null);
       this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

Sljedeći kod dodajte unutar vaše Main klase:

public class Main{

    public static void main(String[] args) {
       MyFrame frame = new MyFrame();
       frame.setVisible(true);
    }
}

Prikaz koda iz gornjeg primjera izgledaće ovako: