Første |
|
|
Java Foundation Classes serie, Planche nr. 36 |
 |
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:
- tastatur
- 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)
- ud af 3 muligheder: JFrame, JWindow og JApplet
- Såkaldte "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)
|
(dens 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(...); //Gælder KUN applications
knap = new JButton(...);
etiket = new JLabel(...);
pane = new JPanel();
pane.add(knap);
pane.add(etiket);
ramme.getContentPane().add(pane);
Hvis man programmerer en applet, har man allerede en topramme, og 1. linie er overflødig, og sidste kan skrives som:
getContentPane().add(pane);
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 parametre i dette eksempel.)
Planche 9 : Opgave

Design den enkle applet ovenfor (eller noget der ligner)
- Opret en ny opgavefolder
- Skriv en klasse, SwingApplet.java, der nedarver fra javax.swing.JApplet.
- Opret globale variable, der peger på alle komponentobjekter
- Skriv en public init() metode, som opretter og tilføjer komponenterne
- Hint: Tidligere planche men uden JFrame!
- JApplet er top-container, og nøgleord this kan bruges som reference.
- 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 og JTextField) hentes fra pakken javax.swing
Komponenterne kommer måske ikke hvor man vil have dem - men derom
senere.
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 (fortsat)
Prøv at sætte forskellige Layoutmanagers i koden til SwingApplet.
- 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 setLayout(null)-metodekaldet.
Gør opgaven færdig uden layoutmanager. Komponenter skal nu
have en størrelse og en position. Brug:
- setBounds(int, int, int, int)
På hver af de visuelle komponenter.
Se i dokumentation for hvad parametrene betyder.
Planche 15 : Objekt kommunikation
Java-objekter kommunikerer på 3 måder:
- Beskeder (alm. metoder)
- Hændelser ("events")
- Undtagelser ("Exceptions")
Planche 16 : 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 17 : 2 modeller
- Eventmodel 1.0
- "Vandfaldsmetoden" ~ Windows-modellen
- Eventmodel 1.1
Planche 18 : 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 19 : Event klasser
- V.1.0: Én hændelsesklasse
- V.1.1: En pakke hændelsesklasser:
Planche 20 : Implementer V.1.1
Checkliste:
- 1. Beslut hvilken hændelser, man ønsker at bruge
- 2. Skriv kode for lyttermetoden
- 3. Registrer lytteren.
Planche 21 : Eksempel - Trin 1
Kig i java.awt.event-pakken og find en passende klasse:
Se nærmere i pakke-dokumentationen
Planche 22 : 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 23 : Eksempel: Trin 2
Implementer interface.
2 måder:
- Lad appletten (eller applikationsklassen) implementere:
class MinKlasse implements Lytterinterface
- Overskriv metoderne fra lytterklassen.
- Skrive en speciel klasse og implementer metoderne den.
- Mest velegnet til store programmer med mange komponenter
Planche 24 : Eksempel: Trin 2 (Eksempel)
Interface ActionListener har en metode, actionPerformed()
Hvis klassen selv er lytter (et event pr klasse)
import java.swing.*;
import java.awt.event.*;
public class MinApplet extends javax.swing.JApplet implements ActionListener {
// øvrige kode...
public void actionPerformed(ActionEvent e) {
// behandling af hændelsen e
}
// øvrige kode
}
Hvis man opretter en særlig lytter-klasse
javax.swing.*;
java.awt.event.*;
public class MinApplet extends javax.swing.JApplet {
// ø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
}
MinActionListener er en "indre" klasse, der kun kendes af MinApplet-klassen.
Planche 25 : 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 26 : Eksempel: Trin 3 (fortsat)
Registrer ActionListener:
- Klassen selv lytter:
- addActionListener (this);
- MinActionListener er defineret
- ml = new MinActionListener();
- addActionListener(ml);
Planche 27 : Simpel eventhåndtering
Metode 1 - SwingApplet er lytter, og venter på tryk på et komponent.
import javax.swing.*;
import java.awt.event.*;
class SwingApplet extends javax.swing.JApplet implements ActionListener {
// Opret visuelt Komponent
JButton knap = new JButton ();
// 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 indsættes her
}
public void actionPerformed(ActionEvent e) {
// behandling af hændelsen e som KUN kan komme
// fra knap-komponenten
}
// øvrige kode
}
Planche 28 : Opgave
Få knappen i SwingApplet.java til at opdatere en tæller, og skriv resultat i etiketten.
- Brug metode 1 (SwingApplet er lytterklassen)
Planche 29 : Hjælpetekster
Hints til et komponent, der laver pop-up hjælp:
Prøv at sætte en hjæpetekst på knappen.
Kan man sætte hjælpetekster på:
- Etiketten?
- Appletten?
- Panelet?
Se i dokumentation - eller prøv!
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.3\demo\jfc\SwingSet2
- skriv:
appletviewer SwingSet2.html
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 bruges NÆSTEN som en JApplet, men den
- Skal oprettes ved hjælp af new
- indeholde en public static void main(String a[]) - metode
- Istedet for init()-metoden bruges en konstruktør
- JFrame-objektet skal have en størrelse og placering
- JFrame-objektet skal gøres synlig med setVisible(true)
Planche 33 : Alternativ: JApplet i Frame
Man kan faktisk bruge en JFrame til at køre en JApplet i.
Spisesedel:
- 1. Opret en main-metode og...
- 2. Opret et objekt af typen SwingApplet
- 3. Opret et andet objekt, af typen JFrame - overskrift "NæstenApplet"
- 4. Tilføj JApplet-objektet til JFrame-objektets ContentPane
- 5. Sæt størrelse af Frame-objektet
- 6. Gør Frame-objektet synligt (metode show())
- 7. Kald init-metode på applet-objektet
- 8. Kald start-metode på applet-objektet
- 9. Kald validate-metode på applet-objekt
Planche 34 : Kør!
Implementer main-metoden jvf. foregående og:
- Skriv: appletviewer SwingApplet.html
- Skriv: java SwingApplet
Planche 35 : Noter
Lukke-knappen virker ikke i denne udgave. For at få den til det, skal man
lade SwingApplet implementer interface WindowListener.
Den forlanger en række metoder implementeret. De kan alle være tomme, undtagen metoden windowClosing(). Den skal indeholde metodekaldet
Eller andet fornuftigt, der skal udføres når vinduet er væk!
Alternativ - skift til DOS-box og tryk CTRL/C!
Planche 36 : Pop-up JFrame
Man kan sagtens kalde en JFrame fra en JApplet.
Eksempel er en JApplet med login-funktion.
Gå til Opgaver-folder og
- Skriv appletviewer SwingPjat.html
- Skriv java SwingPjat
Hvad er forskellen på de to pop-up vinduer
Og hvorfor?
Kildeteksten SwingPjat.java findes i Opgaver-folder.
© 2000 BLA*net - Leif E. Andersen,
leander@blanet.dk