Java - interfejs graficzny Pakiet Swing
Pakiet Swing przygotował: pawel@kasprowski.pl
Czym jest Swing? Rozszerzenie AWT (Abstract Windows Toolkit) do tworzenia GUI (Graphical User Interface) w Javie import java.awt.*; import java.awt.events.*; import javax.swing.*;
Hierarchia Swing Kontenery Top Level Kontenery (general i special) Kontrolki
Kontenery Top-Level JApplet JDialog JFrame
Pozostałe kontenery JPanel JScrollPane JSplitPane JTabbedPane JToolBar
Proste kontrolki JButton JComboBox JList JMenu JSlider JSpinner JTextField
Pierwsza aplikacja okienkowa import javax.swing.*; import java.awt.*; public class FirstWin { public static void main(string[] args) {new FirstWin(); public FirstWin() { JFrame frame = new JFrame("Test"); JPanel contentpane = (JPanel) frame.getcontentpane(); contentpane.add(new JLabel( Hello World")); frame.setvisible(true); FirstWin.java
Pierwsza aplikacja okienkowa import javax.swing.*; import java.awt.*; public class FirstWin { public static void main(string[] args) {new FirstWin(); public FirstWin() { JFrame frame = new JFrame("Test"); JPanel contentpane = (JPanel) frame.getcontentpane(); contentpane.add(new JLabel( Hello World")); frame.setsize(new Dimension(400, 300)); frame.setlocation(100,100); frame.setvisible(true);
Pierwsza aplikacja okienkowa import javax.swing.*; import java.awt.*; public class FirstWin { public static void main(string[] args) {new FirstWin(); public FirstWin() { JFrame frame = new JFrame("Test"); JPanel contentpane = (JPanel) frame.getcontentpane(); contentpane.add(new JLabel( Hello World")); frame.setsize(new Dimension(400, 300)); frame.setlocation(100,100); frame.addwindowlistener( new WindowAdapter() {public void windowclosing(windowevent e) {System.exit(0);); frame.setvisible(true); FirstWin2.java
Pierwsza aplikacja okienkowa import javax.swing.*; import java.awt.*; public class FirstWin { public static void main(string[] args) {new FirstWin(); public FirstWin() { JFrame frame = new JFrame("Test"); JPanel contentpane = (JPanel) frame.getcontentpane(); contentpane.add(new JButton( Click me")); frame.setsize(new Dimension(400, 300)); frame.setlocation(100,100); frame.addwindowlistener( new WindowAdapter() {public void windowclosing(windowevent e) {System.exit(0);); frame.setvisible(true); FirstWin2.java
Zarządzanie położeniem obiektów (Layout) Niezależne od GUI Brak współrzędnych obiektów BorderLayout BoxLayout FlowLayout GridBagLayout GridLayout
Border Layout 5 możliwych miejsc położenia: N,S,W,E i Center
Box Layout Pionowo (Vertical) lub poziomo (Horizontal) Komponenty jeden pod/obok drugiego
Card Layout Komponenty w jednym miejscu
Flow Layout Umieszcza komponenty jeden za drugim z możliwością wstawienia nowego wiersza
Grid Layout Tworzy kratę o podanych wymiarach
GridBagLayout Najbardziej skomplikowany krata ze zmienną liczbą wierszy i kolumn i różnymi ich wielkościami
Layout Manager [1] JPanel contentpane = (JPanel) frame.getcontentpane(); contentpane.setlayout(new BorderLayout()); contentpane.add(new JButton("Click me!"),borderlayout.north); contentpane.add(new JButton("No, Me!"),BorderLayout.SOUTH); Layouts1
Layout Manager [2] JPanel contentpane = (JPanel) frame.getcontentpane(); contentpane.setlayout(new BorderLayout()); contentpane.add(new JButton("Click me!"),borderlayout.north); contentpane.add(new JButton("No, Me!"),BorderLayout.SOUTH); contentpane.add(new JButton("West!"),BorderLayout.WEST); contentpane.add( new JButton( I m in the CENTER"),BorderLayout.CENTER); Layouts2
Layout Manager [3] JPanel contentpane = (JPanel) frame.getcontentpane(); contentpane.setlayout(new GridLayout(3,2)); contentpane.add(new JButton("Click me!")); contentpane.add(new JButton("No, Me!")); contentpane.add(new JButton("West!")); contentpane.add(new JButton( I m in the CENTER")); Layouts3
Layout Manager [4] JPanel contentpane = (JPanel) frame.getcontentpane(); contentpane.setlayout(new GridLayout(3,1)); JPanel inpane = new JPanel(); inpane.setlayout(new GridLayout(1,2)); inpane.add(new JButton("First")); inpane.add(new JButton("Second")); contentpane.add(new JButton("Third")); contentpane.add(new JButton("Fourth")); contentpane.add(inpane); Layouts4
Tworzenie formatki przygotował: pawel@kasprowski.pl
Pierwsza aplikacja okienkowa import javax.swing.*; import java.awt.*; public class FirstWin { public static void main(string[] args) {new FirstWin(); public FirstWin() { JFrame frame = new JFrame("Test"); JPanel contentpane = (JPanel) frame.getcontentpane(); contentpane.add(new JButton( Click me")); frame.setsize(new Dimension(400, 300)); frame.setlocation(100,100); frame.addwindowlistener( new WindowAdapter() {public void windowclosing(windowevent e) {System.exit(0);); frame.setvisible(true); FirstWin2.java
Tworzenie formatki contentpane.setlayout(new BorderLayout()); JPanel upperpanel = new JPanel(); upperpanel.setlayout(new GridLayout(1,2)); upperpanel.add(new JButton("jeden")); upperpanel.add(new JButton("dwa")); contentpane.add(upperpanel,borderlayout.north); contentpane.add(new JTextArea("JTextField"));
Obsługa zdarzeń Komponenty (event sources) generują zdarzenia Zarejestrowane listener y obsługują te zdarzenia
Podstawowe listener y Component listener Obsługuje (nasłuchuje) zmiany wielkości, położenia czy widoczności komponentu. Focus listener Nasłuchuje, czy komponent otrzymał lub utracił focus. Key listener Czeka na naciśnięcie klawisza; wywoływane z komponentu mającego focus. Mouse events Czeka na kliknięcia myszą i wejścia kursora myszy nad komponent. Mouse-motion events Obsługuje ruchy myszą nad komponentem.
Inne popularne listener y Action listener Obsługuje akcje : kliknięcie przycisku, wybranie z menu, naciśnięcie Enter w TextField. void actionperformed(actionevent e) ListSelection listener Obsługuje zmiany w wyborze aktualnego elementu na listach (JList) i tablicach (JTable) void valuechanged(listselectionevent) WindowEvent listener Obsługuje zmiany stanu okien (JFrame i JDialog). void windowopened(windowevent) void windowclosed(windowevent) void windowiconified(windowevent) void windowdeiconified(windowevent) void windowactivated(windowevent) void windowdeactivated(windowevent)
Tworzenie obiektu ActionListener Deklaracja klasy public class MyListener implements ActionListener { Implementacja metod z interface u public void actionperformed(actionevent e) { //obsługa zdarzenia Rejestracja listenera (w programie) MyListener complist = new MyListener(); acomponent.addactionlistener(complist);
Użycie ActionListener [1] class EventEx{ JButton btn = new JButton("Click me!"); MyListener mlist = new MyListener(); class MyListener implements ActionListener{ public void actionperformed(actionevent e) {btn.settext("thank you"); public EventsEx() { Inner class contentpane.add(btn); btn.addactionlistener(mlist); EventEx.class EventEx$MyListener.class EventsEx
Użycie ActionListener [2] class EventEx{ JButton btn = new JButton("Click me!"); class MyListener implements ActionListener{ public void actionperformed(actionevent e) {btn.settext("thank you"); public EventsEx() { contentpane.add(btn); btn.addactionlistener(new MyListener());
Użycie ActionListener [3] class EventEx{ JButton btn = new JButton("Click me!"); public EventsEx() { contentpane.add(btn); Anonymousinnerclass btn.addactionlistener(new ActionListener{ public void actionperformed(actionevent e) {btn.settext("thank you");); EventsEx.class EventsEx$1.class
Użycie ActionListener [4] class EventEx implements ActionListener{ JButton btn = new JButton("Click me!"); public EventsEx() { contentpane.add(btn); btn.addactionlistener(this); public void actionperformed(actionevent e) {btn.settext("thank you");
Jeden Listener dla wielu obiektów [1] JButton bt1 = new JButton("First"); JButton bt2 = new JButton("Second"); public EventsEx() implements ActionListener{ bt1.setactioncommand( FIRST ) bt1.addactionlistener(this); bt2.setactioncommand( SECOND ) bt2.addactionlistener(this); contentpane.add(bt1); contentpane.add(bt2); public void actionperformed(actionevent e){ if (e.getactioncommand() == "FIRST") {bt1.settext(bt1.gettext()+ X"); else {bt2.settext(bt2.gettext()+ X"); EventsEx2
Jeden Listener dla wielu obiektów [2] JButton bt1 = new JButton("First"); JButton bt2 = new JButton("Second"); public EventsEx() implements ActionListener{ bt1.setactioncommand( FIRST ) bt1.addactionlistener(this); bt2.setactioncommand( SECOND ) bt2.addactionlistener(this); contentpane.add(bt1); contentpane.add(bt2); public void actionperformed(actionevent e){ JButton bb; if (e.getactioncommand() == "FIRST") { bb = bt1; else { bb = bt2; bb.settext(bb.gettext()+"x"); EventsEx2
Robudowa przykładu o obsługę zdarzeń Edit2
Obsługa zdarzeń public class Edit2 { JButton b1,b2; JTextArea ta; b1 = new JButton("jeden"); b2 = new JButton("dwa"); ta = new JTextArea("tutaj"); upperpanel.add(b1); upperpanel.add(b2); contentpane.add(ta); b1.addactionlistener( new ActionListener() { public void actionperformed(actionevent e) { ta.settext("jeden"); ); Edit2