Przygotował: Adam Komandera.
Od czasów powstania systemów okienkowych większość programów dostarczanych użytkownikom posiada interfejs graficzny. W Javie interfejs graficzny – zwany GUI (ang.
Graphical User Interface) można tworzyć w oparciu o kila różnych bibliotek. Wymieńmy najważniejsze:
• AWT (Abstract Windowing Toolkit) – pierwsza biblioteka okienkowa Javy. Jej zaletą jest fakt, że jest dostępna we wszystkich wersjach Javy (przeglądarki internetowe często korzystają ze starych wersji nie posiadających innych bibliotek), wadą jest natomiast mało przyjazne API i brak wielu pożytecznych kontrolek.
• Swing – nowsza wersja biblioteki okienkowej, dostępna od wersji 1.2 języka Java. Zaletą tej biblioteki jest wygodny, dobrze przemyślany interfejs i szeroka gama dostępnych komponentów. Wadą jest fakt, że nie ma jej w starszych wersjach Javy, ponadto nie jest ona szczególnie wydajna. Jej komponenty mogą „udawać” komponenty natywne systemu, ale nie zawsze robią to w sposób udany.
• Inne biblioteki, nie dołączane standardowo do Javy – tu wymienić warto zwłaszcza bibliotekę SWT (Standard Widget Toolkit) firmy IBM. Jest ona bardzo wydajna oferuje bogatą paletę komponentów i potrafi dobrze „udawać” komponenty systemowe, dzięki temu, że korzysta z komponentów systemowych wszędzie, gdzie to możliwe. Niestety nie jest standardowo dołączana do Javy i rozpowszechniając program napisany przy jej pomocy musimy ją do niego dołączać.
Wszystkie komponenty biblioteki Swing znajdują się w pakiecie javax.swing i jego podpakietach, zaś komponenty biblioteki AWT – w pakiecie java.awt i jego podpakietach.
Jednak dla łatwiejszego odróżniania klas Swing od klas AWT w bibliotece Swing wprowadzono następującą konwencję nazewniczą: nazwy wszystkich klas tej biblioteki zaczynają się od litery J, po czym następuje właściwa nazwa komponentu, np. JButton oznacza przycisk (ang. button).
Aplikacja okienkowa musi posiadać swoje okno. Okno jest klasą dziedziczącą po klasie java.awt.Window. Jednak w aplikacjach Swing będziemy najczęściej dziedziczyć po klasie javax.swing.JFrame, która jest jej klasą pochodną. Najważniejsze metody klasy JFrame:
• JFrame() – konstruktor domyślny – tworzy nowe okienko,
• JFrame(String tytul) – konstruktor tworzący okienko z ustalonym napisem na belce tytułowej,
• Container getContentPane() – zwraca panel zawartości, w którym należy umieszczać wszystkie komponenty, które mają się znaleźć w oknie aplikacji,
• void setContentPane(Container cp) – ustawia panel zawartości dla aplikacji,
• void setDefaultCloseOperation(int operation) – ustawia operację wykonywaną po zamknięciu aplikacji przez użytkownika, możliwe wartości, to:
– JFrame.DO NOTHING ON CLOSE – nic nie robi (nie zamyka okna) – musimy sami obsłużyć zdarzenie związane z zamykaniem aplikacji,
– JFrame.HIDE ON CLOSE – ukrywa okno (nie zamyka go), jest to wartość domyślna – jeśli jej nie zmienimy tak właśnie zareaguje program na próbę zamknięcia przez użytkownika,
– JFrame.DISPOSE ON CLOSE – zamyka okno i zwalnia jego zasoby (zalecane dla okien potomnych),
– JFrame.EXIT ON CLOSE – zamyka program za pomocą metody System.exit – jest to zalecana reakcja dla okna głównego aplikacji,
• void setJMenuBar(JMenuBar menubar) – ustawia główne menu dla okna,
• void setLayout(LayoutManager manager) – ustawia menedżera układu dla okna – domyślnie użyty jest menedżer java.awt.BorderLayout,
• void addWindowListener(WindowListener l) – dodaje odbiorcę zdarzeń związanych z oknem (takich jak na przykład zamknięcie okna).
• void setBounds(int x, int y, int width, int height) - ustawia pozycję i wymiary okna (po kolei: odległość od lewej krawędzi ekranu, odległość od góry ekranu, wysokość i szerokość; wszystkie odległości podane w pikselach),
• void setVisible(boolean widoczne) – ustawia widzialność okienka.
Przykład ad1.java
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class ad1
{ JFrame f;
void init()
{
f=new JFrame();
f.setTitle("Moja pierwsza aplikacja okienkowa!");
f.setBounds(100,100, 400, 200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args)
{ new ad1().init();
}
}
Otrzymamy:
Menedżery układu
Układ komponentów w oknie zależy od zastosowanego menedżera układu. Menedżer taki jest obiektem klasy dziedziczącej po LayoutManager. Menedżera układu ustawia się za pomocą funkcji setLayputManager, ale wywołanej dla panelu zawartości, a nie bezpośrednio dla komponentu Kilka najważniejszych menedżerów.
Domyślny menedżder układu, ma 5 miejsc, w których możemy umieszczać komponenty: północ, południe, wschód, zachód i środek. Dodając komponent do panelu zawartości należy podać w metodzie add drugi argument jako jeden z następujących:
• BorderLayout.NORTH – dodawany komponent będzie umieszczony na górze okna,
• BorderLayout.SOUTH – dodawany komponent będzie umieszczony na dole okna,
• BorderLayout.EAST – dodawany komponent będzie umieszczony po prawej stronie okna,
• BorderLayout.WEST – dodawany komponent będzie umieszczony po lewej stronie okna,
• BorderLayout.CENTER – dodawany komponent będzie umieszczony w środkowej części okna.
Przykład ad2.java
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class ad2
{ JFrame f;
JButton b1,b2,b3,b4,b5;
void init()
{
f=new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400,400);
f.setTitle("Przykład BorderLayout");
Container c=f.getContentPane();
c.setLayout(new BorderLayout(1,1));
b1 = new JButton();
b1.setText("Środek");
b2 = new JButton();
b2.setText("Zachód");
b3 = new JButton();
b3.setText("Wschód");
b4 = new JButton();
b4.setText("Południe");
b5 = new JButton();
b5.setText("Północ");
c.add(b1, BorderLayout.CENTER);
c.add(b2, BorderLayout.WEST);
c.add(b3, BorderLayout.EAST);
c.add(b4, BorderLayout.SOUTH);
c.add(b5, BorderLayout.NORTH);
f.setVisible(true);
}
public static void main(String[] args)
{ new ad2().init();
}
}
FlowLayout
Najprostszy menedżer układu. Układa komponenty po prostu liniami, kiedy w jednej linii już
się nie mieszczą przechodzi do następnej. W przypadku zmiany rozmiaru okna automatycznie dopasowuje układ komponentów.
GridLayout
Menedżer tabelkowy. Jego konstruktor przyjmuje dwa argumenty typu int – pierwszy oznaczajacy ilość wierszy, a drugi kolumn tabeli. Dodawane komponenty są umieszczane w kolejnych komórkach tabeli, po kolei, wierszami.
Przykład ad3.java
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class ad3
{ JFrame f;
JButton b1,b2,b3,b4,b5;
void init()
{
f=new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400,200);
f.setTitle("Przykład GridLayout");
Container c=f.getContentPane();
c.setLayout(new GridLayout(3,2,1,1));
b1 = new JButton();
b1.setText("1");
b2 = new JButton();
b2.setText("2");
b3 = new JButton();
b3.setText("3");
b4 = new JButton();
b4.setText("4");
b5 = new JButton();
b5.setText("5");
c.add(b1);
c.add(b2);
c.add(b3);
c.add(b4);
c.add(b5);
f.setVisible(true);
}
public static void main(String[] args)
{ new ad3().init();
}
}
Etykieta JLabel
Etykiety służą do wyświetlania statycznego tekstu (tzn. takiego, którego użytkownik nie może edytować). Komponent JLabel (w odróżnieniu od protoplasty – komponentu java.awt.Label) ma ponadto możliwość wyświetlania obrazków, elementów HTML oraz obramowania.
Metody klasy JLabel:
• JLabel() – konstruktor domyślny – tworzy pustą etykietę,
• JLabel(String text) – tworzy etykietę z napisem text,
• JLabel(Icon image) – tworzy etykietę z obrazkiem (ikonką) image,
• JLabel(String text, Icon icon, int hAlignment) – tworzy etykietę z tekstem i grafiką, ostatni paramert oznacza wyrównywanie (np. SwingConstants.LEFT dla wyrównania do lewej),
• void setIcon(Icon icon) – ustawia ikonkę na etykiecie na podany obraz,
• void setText(String text) – ustawia tekst na etykiecie na podany jako parametr, Jeżeli w treści etykiety umieścimy tekst zaczynający się od ”<html>”, wówczas zostanie on sformatowany jako HTML.
Przykład ad4.java
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class ad4
{ JFrame f;
void init()
{
f=new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400,200);
f.setTitle("Przykład Etykieta, Etykieta z grafiką");
Container c=f.getContentPane();
c.setLayout(new GridLayout(1,0,1,1));
c.add(new JLabel("<html><h1>To jest etykieta</h1></html>")); c.add(new JLabel(new ImageIcon("foto.jpg" )));
f.setVisible(true);
}
public static void main(String[] args)
{ new ad4().init();
}
}
Przycisk JButton
Przyciski zazwyczaj udostępniają użytkownikowi możliwość zainicjalizowania jakiejś akcji poprzez ich kliknięcie. Komponent JButton (podobnie jak JLabel) może wyświetlać tekst, grafikę oraz elementy HTML.
Wybrane metody klasy JButton:
• JButton() – konstruktor domyślny – tworzy pusty przycisk,
• JButton(String text) – tworzy przycisk z napisem text,
• JButton(Icon icon) – tworzy przycisk z obrazkiem (ikonką) image,
• JButton(String text, Icon icon) – tworzy przycisk z tekstem i grafiką,
• void setIcon(Icon icon) – ustawia ikonkę na przycisku na podany obraz,
• void setText(String text) – ustawia tekst na przycisku na podany jako parametr,
• void doClick() – powoduje programowe „kliknięcie” przycisku,
Można również ustawiać inne ikony wyświetlane w momencie przejścia myszki nad przyciskiem i w momencie kliknięcia przycisku.
Przykład
import javax.swing.*;
public class Buttons extends JFrame
{
JButton koniec = new JButton ("Koniec");
public Buttons ()
{
super ("Buttons");
setSize(80,140);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel pane = new JPanel ();
pane.add(koniec);
setContentPane(pane);
}
public static void main (String[] args)
{
Buttons rb = new Buttons();
rb.show();
}
}