Første
Java Foundation Classes serie, Planche nr. 35
Kursus Indhold

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:

Opdelingen er historisk betinget.

Planche 2 : JFC begreber

Planche 3 : Komponenter og containerhieraki

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:

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:

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. 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. Swingkomponenterne (JApplet, JPanel, JButton, JLabel) hentes fra pakken javax.swing

Prøv at køre programmet...

Planche 10 : JApplet vs. Applet?

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.

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:

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:

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:

Planche 18 : 2 modeller

Planche 19 : Eventmodel 1.1

Der er to dele i eventmodel 1.1 De sammenkædes, ved at lytteren registrerer sig for at modtage en specifik hændelse.

Planche 20 : Event klasser

Planche 21 : Implementer V.1.1

Checkliste:

Planche 22 : Eksempel - Trin 1

Kig i java.awt.event og find en passende klasse:
  • ActionEvent
  • AdjustmentEvent
  • ComponentAdapter
  • ComponentEvent
  • ContainerAdapter
  • ContainerEvent
  • FocusAdapter
  • FocusEvent
  • InputEvent
  • ItemEvent
  • KeyAdapter
  • KeyEvent
  • MouseAdapter
  • MouseEvent
  • MouseMotionAdapter
  • PaintEvent
  • TextEvent
  • WindowAdapter
  • WindowEvent
  • 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:

    Planche 24 : Eksempel: Trin 2

    Implementer interface.

    2 måder:

    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
    }
    
    MinActionListener er en "indre" klasse, der kun kendes af MinApplet-klassen.

    Planche 26 : Eksempel: Trin 3

    Registrer lytteren:

    Planche 27 : Eksempel: Trin 3 (fortsat)

    Registrer ActionListener:

    Planche 28 : 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 29 : Opgave 4c

    Lav få knappen til at tælle en tæller op og vis det i etiketten

    Planche 30 : Genvejstaster

    Det er muligt at definere genvejstaster (ALT+bogstav):

    Planche 31 : SwingSet-demo

    Der er en imponerende oversigt over, hvad der muligheder for i Swing-bibliotekerne:

    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:

       public static void main (String args[])
    

    Planche 35 : Kør!

    Set eksempel i ../Forslag/... folderen

    Hvad er forskellen på udseendet?

    og hvorfor?


    © 2000 BLA*net - Leif E. Andersen, leander@blanet.dk
    Første
    Java Foundation Classes serie, Planche nr. 35