przygotował: pawel@kasprowski.pl
Java - interfejs graficzny
Pakiet Swing
przygotował: pawel@kasprowski.pl
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.*;
przygotował: pawel@kasprowski.pl
Hierarchia Swing
• Kontenery ‘Top Level’
• Kontenery (general i special)
• Kontrolki
przygotował: pawel@kasprowski.pl
Kontenery Top-Level
• JApplet
• JDialog
• JFrame
przygotował: pawel@kasprowski.pl
Pozostałe kontenery
• JPanel
• JScrollPane
• JSplitPane
• JTabbedPane
• JToolBar
przygotował: pawel@kasprowski.pl
Proste kontrolki
• JButton
• JComboBox
• JList
• JMenu
• JSlider
• JSpinner
• JTextField
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 JLabel(”Hello World"));
frame.setVisible(true);
}
}
FirstWin.java
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 JLabel(”Hello World"));
frame.setSize(new Dimension(400, 300));
frame.setLocation(100,100);
frame.setVisible(true);
}
}
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 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
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
przygotował: pawel@kasprowski.pl
Zarządzanie położeniem
obiektów (Layout)
• Niezależne od GUI
• Brak współrzędnych obiektów
• BorderLayout
• BoxLayout
• FlowLayout
• GridBagLayout
• GridLayout
przygotował: pawel@kasprowski.pl
Border Layout
• 5 możliwych miejsc położenia: N,S,W,E i
Center
przygotował: pawel@kasprowski.pl
Box Layout
• Pionowo (Vertical) lub poziomo (Horizontal)
• Komponenty jeden pod/obok drugiego
przygotował: pawel@kasprowski.pl
Card Layout
• Komponenty w jednym miejscu
przygotował: pawel@kasprowski.pl
Flow Layout
• Umieszcza komponenty jeden za drugim z
możliwością wstawienia ‘nowego wiersza’
przygotował: pawel@kasprowski.pl
Grid Layout
• Tworzy kratę o podanych wymiarach
przygotował: pawel@kasprowski.pl
GridBagLayout
• Najbardziej skomplikowany – krata ze zmienną liczbą
wierszy i kolumn i różnymi ich wielkościami
przygotował: pawel@kasprowski.pl
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
przygotował: pawel@kasprowski.pl
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
przygotował: pawel@kasprowski.pl
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
przygotował: pawel@kasprowski.pl
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
przygotował: pawel@kasprowski.pl
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
przygotował: pawel@kasprowski.pl
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"));
...
przygotował: pawel@kasprowski.pl
Obsługa zdarzeń
• Komponenty (event sources) generują
zdarzenia
• Zarejestrowane listener’y obsługują te
zdarzenia
przygotował: pawel@kasprowski.pl
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.
przygotował: pawel@kasprowski.pl
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)
przygotował: pawel@kasprowski.pl
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);
przygotował: pawel@kasprowski.pl
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()
{
...
contentPane.add(btn);
btn.addActionListener(mlist);
...
}
}
Inner class
EventEx.class
EventEx$MyListener.class
EventsEx
przygotował: pawel@kasprowski.pl
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()
);
...
}
}
przygotował: pawel@kasprowski.pl
Użycie ActionListener [3]
class EventEx{
JButton btn = new JButton("Click me!");
public EventsEx()
{
...
contentPane.add(btn);
btn.addActionListener(
new
ActionListener{
public void actionPerformed(ActionEvent e)
{btn.setText("Thank you");}
);
...
}
}
Anonymous inner class
EventsEx.class
EventsEx$1.class
przygotował: pawel@kasprowski.pl
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");}
}
przygotował: pawel@kasprowski.pl
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
przygotował: pawel@kasprowski.pl
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
przygotował: pawel@kasprowski.pl
Robudowa przykładu o obsługę
zdarzeń
Edit2
przygotował: pawel@kasprowski.pl
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