background image

przygotował: pawel@kasprowski.pl

Java - interfejs graficzny

Pakiet Swing

background image

przygotował: pawel@kasprowski.pl

Pakiet Swing

background image

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.*;

background image

przygotował: pawel@kasprowski.pl

Hierarchia Swing

• Kontenery ‘Top Level’
• Kontenery (general i special)
• Kontrolki

background image

przygotował: pawel@kasprowski.pl

Kontenery Top-Level

• JApplet

• JDialog

• JFrame

background image

przygotował: pawel@kasprowski.pl

Pozostałe kontenery

• JPanel

• JScrollPane

• JSplitPane

• JTabbedPane

• JToolBar

background image

przygotował: pawel@kasprowski.pl

Proste kontrolki

• JButton
• JComboBox
• JList
• JMenu
• JSlider
• JSpinner
• JTextField

background image

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

background image

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

}

}

background image

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

background image

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

background image

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

background image

przygotował: pawel@kasprowski.pl

Border Layout

• 5  możliwych miejsc położenia: N,S,W,E i 

Center

background image

przygotował: pawel@kasprowski.pl

Box Layout

• Pionowo (Vertical) lub poziomo (Horizontal)
• Komponenty jeden pod/obok drugiego

background image

przygotował: pawel@kasprowski.pl

Card Layout

• Komponenty w jednym miejscu

background image

przygotował: pawel@kasprowski.pl

Flow Layout

• Umieszcza komponenty jeden za drugim z 

możliwością wstawienia ‘nowego wiersza’

background image

przygotował: pawel@kasprowski.pl

Grid Layout

• Tworzy kratę o podanych wymiarach

background image

przygotował: pawel@kasprowski.pl

GridBagLayout

• Najbardziej skomplikowany – krata ze zmienną liczbą 

wierszy i kolumn i różnymi ich wielkościami

background image

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

background image

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

background image

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

background image

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

background image

przygotował: pawel@kasprowski.pl

Tworzenie formatki

background image

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

background image

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"));

...

background image

przygotował: pawel@kasprowski.pl

Obsługa zdarzeń

• Komponenty (event sources) generują 

zdarzenia 

• Zarejestrowane listener’y obsługują te 

zdarzenia

background image

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. 

background image

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)

background image

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

background image

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

background image

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

);

...

}

}

background image

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

background image

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

}

background image

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

background image

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

background image

przygotował: pawel@kasprowski.pl

Robudowa przykładu o obsługę 

zdarzeń

Edit2

background image

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