Nada

Föreläsning 3: Swingkomponenter, abstrakta klasser.

Interface och abstrakta klasser

Ett interface är ett gränssnitt mellan en klass som implementerar detta interface och en annan klass som använder det. Ofta är det sedan en tredje klass som kopplar samman ett objekt av vardera klassen.
interface Larvig                            { //Gränssnitt
  public void larva()                       ;}

class Larvare implements Larvig             { //Implementerar gränssnitt.
  public void larva()                       {
    System.out.println("larv, larv...")     ;}}

class Larvcirkus                            { //Använder gränssnitt.
  public void larvning(Larvig person)       { //Metoden vet inte vilken
    System.out.println("Larva dej!")        ; //klass person är.
    person.larva()                          ;}}

class Huvudprogram                          { //i en tredje klass
  public static void main(String[] args)    { //kopplas objekt av
    Larvcirkus cirkus = new Larvcirkus()    ; //vardera klassen ihop 
    Larvare larvare = new Larvare()         ;
    cirkus.larvning(larvare)                ;}}
Fastän man inte kan skapa objekt av ett interface går det alltså att deklarera variabler och parametrar som interface. Objektet cirkus kan skapas innan klassen Larvare ens är påtänkt fastän dess metodparameter person en gång kommer att vara en Larvare.
     _______        __________
    /Larvig \______|Larvcirkus|       ____________
    \_______/      |__________|------|Huvudprogram|
        ^                            |            |
     ___|___                         |            |
    |Larvare|------------------------|____________|
    |_______|
Ett mellanting mellan interface och vanlig klass är abstract class som bara är delvis implementerad. Det går därför inte att skapa objekt av den abstrakta klassen med new utan enda användningssättet är att göra extend och implementera dom saknade metoderna.
abstract class AbstractTrams {  //En abstrakt klass
  public String toString()   {  //kan ha både konkreta
    return "TRAMS"           ;} //(implementerade) och
  abstract void trams()      ;} //abstrakta metoder.
Javabibliotekets AbstractButton har faktiskt inga abstrakta metoder men har gjorts abstrakt för att ingen ska luras att skapa objekt av den - den har nämligen inget utseende. Alla konkreta knappklasser som gör extend på den implementerar ett visst utseende, till exempel radioknappar och checkboxar.

JButton

En knapp låter som en enkel komponent men en swingknapp kan massor med saker. Bland annat förstår den HTML-kod, och det gör att man kan få önskat utseende på knapptexten med bilder och allt. Hjälpbubblor är lätt att lägga in.
JButton knapp = new JButton("<html>Tjo<b>hej!</b></html>",
                    new ImageIcon("frog.gif"));
knapp.set ToolTipText("Klicka på grodan!");

JFrame och JApplet

Långt innan Java uppfanns hade datorernas operativsystem fönsterhanterarprogram som ritade fönster för nyttoprogrammen att köra i. Nackdelen med dessa tungviktsfönster är att nyttoprogrammet inte har full kontroll över deras utseende och uppförande, därför är swingkomponenterna lättviktare som inte blandar in fönsterhanteraren. Det yttersta fönstret, rotfönstret, måste dock vara en tungviktare och därför lägger JFrame en osynlig lättviktsbehållare omedelbart innanför rotfönstret. Det är i denna ContentPane, inte i själva JFrame-fönstret, man lägger sina komponenter.
  JFrame ram = new JFrame("Rotfönster")                        ;
  ram.getContentPane().add(new JButton("Tryck om du vågar!"))  ;
  ram.getContentPane().add(new JLabel("<-"),BorderLayout.EAST) ;
  ram.setSize(300,400)                                         ;
  ram.setVisible(true)                                         ;

JList

Grafiska komponenter som låter en välja från en lista finns det några olika av. Den allmännaste är JList som låter en använda valfri modell bara den implementerar gränssnittet ListModel. Man kan också nöja sej med den färdiga klassen DefaultListModel.
     ________      _______
    |JList   |    /ListModel\  Först tillverkas modellen som
    |        |----|         |  sedan skickas med i konstruktorn
    |________|    \_________/  new JList(modellen)
                       ^
                       |
                  _____|__________
                 |DefaultListModel|    
                 |________________|
Ett färdigt programexempel kommer i nästa föreläsning.

JTree

Ett allmänt träd av den typ som visar ett bokverks indelning i volymer, kapitel, avsnitt, stycken etc eller en filkatalogstruktur kan modelleras i en TreeModel och visas upp av komponenten JTree. Ett exempel finns i laboration 4.
Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 29 januari 2004
Tekniskt stöd: <webmaster@nada.kth.se>