Videregående programmering i Java

Dag 6 – Komponenter (og lidt Swing og MVC)

Læsning: VP 4, evt. VP 6

Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html

Grafiske komponenter

import java.awt.*;

public class GrafiskVindue extends Frame

{

Label labelHvadErDitNavn = new Label();

TextField textFieldNavn = new TextField();

public GrafiskVindue() {

try {

jbInit();

}

catch(Exception e) {

e.printStackTrace();

}

}

private void jbInit() throws Exception {

labelHvadErDitNavn.setText("Hvad er dit navn?");

labelHvadErDitNavn.setBounds(new Rectangle(15, 69, 108, 15));

textFieldNavn.setText("Jacob");

textFieldNavn.setBounds(new Rectangle(141, 61, 112, 29));

this.setLayout(null);

this.add(textFieldNavn, null);

this.add(labelHvadErDitNavn, null);

}

public void paint(Graphics g)

{

g.drawLine(0,0,50,50);

g.fillOval(5,20,300,30);

g.setColor(Color.green);

String navn = textFieldNavn.getText();

for (int i=0; i<50; i=i+10)

g.drawString("Hej "+navn+" !",100+i,30+i);

}

}

Design-fanen

Visuelt designområde

Struktur af programmet

Egenskaber (og hændelser) på valgt element

Komponentfaner

Visuelt design af et grafisk program

Karakteristika ved javabønner

Komponenter er programmørens byggeklodser

De kan bruges igen og igen i mange sammenhænge

De kan sættes sammen på alle mulige måder

De er nemme at indstille

Udviklingsværktøj kan generere programkoden for programmøren

Grafiske brugergrænseflader er som regel helt bygget op af komponenter!

Komponenter i Java hedder Javabønner (eng.: JavaBeans)

Genbrugelige komponenter

Komponentbaseret udvikling

Hændelser - genereret af værktøj

import java.awt.*;

public class GrafiskVindue extends Frame

{

Button buttonOpdater = new Button();

TextArea textAreaHilsen = new TextArea();

...

private void jbInit() throws Exception {

...

buttonOpdater.setLabel("opdater!");

buttonOpdater.setBounds(new Rectangle(231, 60, 91, 32));

buttonOpdater.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

buttonOpdater_actionPerformed(e);

}

});

textAreaHilsen.setText("Her kommer en tekst...");

textAreaHilsen.setBounds(new Rectangle(6, 102, 316, 78));

this.add(textAreaHilsen, null);

this.add(buttonOpdater, null);

}

void buttonOpdater_actionPerformed(ActionEvent e) {

String navn = textFieldNavn.getText();

System.out.println("Opdater! navn="+navn);

textAreaHilsen.setText("Hej kære "+navn);

repaint(); // gentegn vinduet, så paint() bliver kaldt

}

...

}

Designmønstret Observatør/Lytter

(eng.: Observer/Listener)
eller Abonnent (eng.: Publisher-Subscriber)

('abonnere' på, at en ting (hændelse) sker)

Problem: Et objekt skal kunne underrette nogle andre objekter om en eller anden ændring eller hændelse, men det er ikke hensigtsmæssigt, at objektet kender direkte til de andre objekter.

Løsning: Lad lytterne (observatørerne) implementere et fælles interface (eller arve fra en fælles superklasse) og registrere sig hos det observable (observerbare) objekt. Det observable objekt kan herefter underrette lytterne gennem interfacet, når der er brug for det.

Designmønstret Observatør/Lytter

Eksempel: Fælles kalender for en forening, der udbyder foredrag

Hvis der sker ændringer i planen, skal kun de interesserede medlemmer have besked, dvs. de, som har tilmeldt sig et givent foredrag.

xxx Interface Observerbar slettes, MedlemsIF omdøbes til Observatoer

Designmønstret Observatør/Lytter

Programkode til observabelt objekt (og javabønne)

Præsentatoner fra kurset Videregående programmering i Java

2004-08-30T12:23:21