Første |
|
|
Java Foundation Classes serie, Planche nr. 35 |
 |
Udskrift af : Java Foundation Classes
|
Planche 1 : Java Foundation Classes
JFC er fælles navn for alle de grafiske grænsefladeelementer i JDK'en.
JFC består af 2 klasseamlinger:
- Abstract Windows Toolkit (AWT)
- Swing-biblioteket
Opdelingen er historisk betinget.
Planche 2 : JFC begreber
- Komponenter og containerhieraki
- Layout-managers
- Event-håndtering
- Skærmtegning
- Tråde
Planche 3 : Komponenter og containerhieraki
- Visuelle skærmelementer kaldes komponenter.
- Komponenter er klasser
- Kompenent-klasser er nedarvet fra java.lang.Component
- Det er knapper, etiketter, indtastningsfelter, mv.
- Containere er komponenter, der:
- Indeholder andre komponenter
- er nedarvet fra java.lang.Container
- er vinduer, menuer, applets, paneler, mv.
Planche 4 : Layout-manager
Klasser, der kan styre placeringen af
komponenters placering og størrelse i en container.
Planche 5 : Event-håndtering
Hændelser (event) er en mekanisme, hvormed JVM kan signalere
at nogen har påvirket et komponent.
Events laves af:
- tastaturt
- mus
- øvrige system
- andre programmer
Planche 6 : En Swing-applikation
Her er et eksempel på et Swing-vindue:

(Vi bruger betegnelsen Swing fremfor JFC, fordi vi herfra bruger de såkaldte Swingkomponenter - hvis navne starter med J)
Applikationen består af 4 komponenter:
- En grundlæggende ramme (JFrame)
- 3 muligheder: JFrame, JWindow og JApplet
- "Tunge" komponenter
- En flade eller panel (eng: panel / pane) (JPanel)
- En knap (JButton)
- En etiket (JLabel)
Planche 7 : Container-hierakiet
Alle Swingkomponenter er en del af containerhierakiet:
JFrame (en top-container)
|
...
|
indholdspanel
|
JPanel
|
+----------------+
| |
JButton JLabel
Planche 8 : Opbygning af billede
Design af et billede sker ved at oprette objekter af de respektive komponentklasser, og tilføje dem til containterobjekter.
- Opret med new
- Tilføj med add()-metoder
Sætningerne, der opbygger det simple billede er følgende:
ramme = new JFrame(...);
knap = new JButton(...);
etiket = new JLabel(...);
pane = new JPanel();
pane.add(knap);
pane.add(etiket);
ramme.getContentPane().add(pane, BorderLayout.CENTER);
Bemærk, at man ikke kan tilføje komponenter direkte til en top-container
kun til indholdspanelet (som hentes via getContentPane())
(Der er ikke variabelerklæringer eller alle parametre i dette udsnit.)
Planche 9 : Opgave 4a
Design den simple SwingApplication ovenfor - men med danske tekster.
- Opret en ny opgavefolder JavaOpg4
- Skriv en klasse, SwingApplet.java, der nedarver fra javax.swing.JApplet.
- Opret variable, der peger på alle komponentobjekter
- Skriv en public init() metode, som opretter og tilføjer komponenterne
- Hint: Tidligere planche, men uden JFrame!
- Skriv en HTML-fil, SwingApplet.html, til at køre appletten
- "Klip" evt. HTML-fil fra tidligere opgaver og ret klassenavne.
Swingkomponenterne (JApplet, JPanel, JButton, JLabel) hentes fra pakken
javax.swing
Prøv at køre programmet...
Planche 10 : JApplet vs. Applet?
- Brug JApplet
- når man arbejder med Swing-komponenter
- dvs. J-klasser
- Brug Applet
- ved simpel grafik
- rene AWT-komponenter
- Aldrig samtidig!
Planche 11 : Layout-managers
Et antal eksempler på Layoutmanagers:

Planche 12 : Hvor?
Layoutmanagers arbejder på container-objekter.
JPanel pane = new JPanel();
pane.setLayout(new BorderLayout());
Sætter en BorderLayout-manager på JPanel-objektet pane.
Planche 13 : Opgave 4b
Prøv at sætte forskellige Layoutmanagers i koden til opgave 4.
Tilføj først flere etiketter, for at gøre det mere interessant.
- Prøv
- FlowLayout()
- GridLayout()
- BorderLayout()
- Og
- Hvad sker der, når man sætter null istedet for en layoutmanager?
Planche 14 : Uden layoutmanager!
Stort set alle visuelle værktøjer kan ikke finde ud af at
håndtere layou-manager. Brugerne har også svært ved at forstå
flydende knapper, felter og så videre. Derfor slår man ofte
layoutmanagerne fra ved setLayoutManager(null)-metodekaldet.
Gør opgave 4b færdig uden layoutmanager. Komponenter skal nu
have en størrelse og en position. Brug:
- setBoundary(int, int, int, int)
Se i dokumentation for hvad parametrene betyder.
Planche 15 : Hjælpetekster
Hints til et komponent, der laver pop-up hjælp:
Prøv at sætte en hjæpetekst på knappen.
Slut på opgave 4b
Planche 16 : Objekt kommunikation
Java-objekter kommunikerer på 3 måder:
- Beskeder (alm. metoder)
- Hændelser ("events")
- Undtagelser ("Exceptions")
Planche 17 : Hændelser ("Events")
Hændelser er metoder, der udføres som en del af den forventede afvikling
af programmer, på tidspunkter der ikke kan fastsættes.
Eksempel:
- Museklik,
- Tastaturtryk,
- Kompenentaktivering
Planche 18 : 2 modeller
- Eventmodel 1.0
- "Vandfaldsmetoden" ~ Windows-modellen
- Eventmodel 1.1
Planche 19 : Eventmodel 1.1
Der er to dele i eventmodel 1.1
- Objektet, der modtager hændelsen
- Hændelseslytteren ("Event Listener")
- modtager hændelser af en bestemt type, f.eks. fra musebevægelser
De sammenkædes, ved at lytteren registrerer sig for at modtage en
specifik hændelse.
Planche 20 : Event klasser
- V.1.0: Én hændelsesklasse
- V.1.1: En pakke hændelsesklasser:
Planche 21 : Implementer V.1.1
Checkliste:
- 1. Beslut hvilken hændelser, man ønsker at bruge
- 2. Skriv kode for lyttermetoden
- 3. Registrer lytteren.
Planche 22 : Eksempel - Trin 1
Kig i java.awt.event og find en passende klasse:
Se nærmere i pakke-dokumentationen
Planche 23 : Eksempel - trin 1 (fortsat)
Klasserne implementeres v.h.a følgende interface-klasser:
ActionListener
AdjustmentListener
ComponentListener
ContainerListener
FocusListener
ItemListener
KeyListener
MouseListener
MouseMotionListener
TextListener
WindowListener
De mest interessante er:
- ActionListener
- MouseListener
- MouseMotionListener
- KeyListener
Planche 24 : Eksempel: Trin 2
Implementer interface.
2 måder:
- Lad appletten (eller applikationsklassen) implementere:
class MinKlasse implements Lytterinterface
- Overskriv metoderne fra lytterklassen.
- Udvid event-klasserne og overskriv metoderne heri.
- Mest velegnet til store programmer med mange klasser
Planche 25 : Eksempel: Trin 2 (Eksempel)
Interface ActionListener har en metode, actionPerformed()
Hvis klassen selv er lytter (et event pr klasse)
import java.awt.event.*;
public class MinApplet extends java.applet.Applet implements ActionListener {
// øvrige kode...
public void actionPerformed(ActionEvent e) {
// behandling af hændelsen e
}
// øvrige kode
}
Hvis man opretter en særlig lytter-klasse
java.awt.event.*;
public class MinApplet extends java.applet.Applet {
// øvrige kode...
class MinActionListener implements ActionListener {
Lokalhenvisning h;
MinActionListener(Lokalhenvisning h) {
// konstruktør
this.h = h ;
}
public void actionPerformed(ActionEvent e) {
// behandling af aktions-hændelse
}
}
// øvrige kode
}
Planche 26 : Eksempel: Trin 3
Registrer lytteren:
- Hvis klassen selv er lytter:
- kald tilføjelses-metode med this
- Hvis man har lavet en lytterklasse
- kald tilføjelses-metoden med et objekt af klassen
Planche 27 : Eksempel: Trin 3 (fortsat)
Registrer ActionListener:
- Klassen selv lytter:
- addActionListener (this);
- MinActionListener er defineret
- ml = new MinActionListener();
- addActionListener(ml);
Planche 28 : Simpel eventhåndtering
Metode 1 - MinApplet er lytter, og venter på tryk på et komponent.
(Udskift typen Komponent med en passende JFC-klasse, f.eks. JButton)
import java.awt.event.*;
class MinApplet extends javax.swing.JApplet implements ActionListener {
// Opret visuelt Komponent
Komponent knap = new Komponent ();
// Om videre behandling af 'knap' se JFC afsnit
// øvrige kode...
public void init() {
// Når applet oprettes, registrerer den sig som lytter på
// knap-komponenten:
knap.addActionListener(this);
// øvrige init-kode
}
public void actionPerformed(ActionEvent e) {
// behandling af hændelsen e som KUN kan komme
// fra knap-komponenten
}
// øvrige kode
}
Planche 29 : Opgave 4c
Lav få knappen til at tælle en tæller op og vis det i etiketten
- Bruge metode 1 (SwingApplet er lytterklassen)
Planche 30 : Genvejstaster
Det er muligt at definere genvejstaster (ALT+bogstav):
- setMnemonic(bogstav)
- hvor bogstav er at type char eller int.
Planche 31 : SwingSet-demo
Der er en imponerende oversigt over, hvad der muligheder for
i Swing-bibliotekerne:
- Åben Dos-box
- gå til c:\jdk1.2\demo\jfc\SwingSet
- skriv:
java SwingSet
Planche 32 : Applikationer
Den nemmeste måde at lave programmer, der både kan køre som applets og som applicationer er at lade den visuelle del være i en særlig container - en JFrame.
En JFrame kan oprettes og vises fra en applet (pop-up) og
fra en main-metode.
Planche 33 : Applet -> JFrame
Lav i SwingApplet.java en ny definition af SwingApplet-klassen
oppe foran.
Lav init()-metoden og lad den oprette et objekt af SwingFrame-klassen
Brug setVisible(true)-metoden på dette objekt.
Ændre den gamleklasse definition, så navnet nu bliver SwingFrame og at den udvider JFrame.
(Filen indeholder nu to klassedefinition - SwingApplet og SwingFrame.
Derfor bør SwingFrame ikke være public.
Planche 34 : JFrame -> Application
Det er forholds enkelt at lave en Frame-afledt klasse om til en applikation:
- Tilføje den særlige metode main til klassen:
public static void main (String args[])
- Opret et objekt af klassen i main
- Set størrelsen af objektet (setSize())
- Vis den med setVisible(true)
Planche 35 : Kør!
- Skriv: appletviewer SwingApplet.html
- Skriv: java SwingApplet
Hvad er forskellen på udseendet?
© 1999 BLA*net - Leif E. Andersen,
leander@blanet.dk