Første
Java Foundation Classes serie, Planche nr. 36
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)
                               |
                      (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. 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);

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)

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?

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.

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:

På hver af de visuelle komponenter.

Se i dokumentation for hvad parametrene betyder.

Planche 15 : Objekt kommunikation

Java-objekter kommunikerer på 3 måder:

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:

Planche 17 : 2 modeller

Planche 18 : 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 19 : Event klasser

Planche 20 : Implementer V.1.1

Checkliste:

Planche 21 : Eksempel - Trin 1

Kig i java.awt.event-pakken 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 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:

    Planche 23 : Eksempel: Trin 2

    Implementer interface.

    2 måder:

    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:

    Planche 26 : Eksempel: Trin 3 (fortsat)

    Registrer ActionListener:

    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.

    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å:

    Se i dokumentation - eller prøv!

    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 bruges NÆSTEN som en JApplet, men den

    Planche 33 : Alternativ: JApplet i Frame

    Man kan faktisk bruge en JFrame til at køre en JApplet i.

    Spisesedel:

    Planche 34 : Kør!

    Implementer main-metoden jvf. foregående og:

    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

    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
    Første
    Java Foundation Classes serie, Planche nr. 36