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();
}
}