vprg 12 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Vprg 12 PowerPoint Presentation
Download Presentation
Vprg 12

Loading in 2 Seconds...

play fullscreen
1 / 17

Vprg 12 - PowerPoint PPT Presentation


  • 101 Views
  • Uploaded on

Vprg 12. GUI-programmering, del 3 Vinduslyttere Dialogvinduer GUI-komponenten JTable Egne datamodellklasser. LC191D Videregående programmering Semesterplan: http://aitel.hist.no/fag/vprg/index_LC191D.php Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Vprg 12' - toril


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
vprg 12

Vprg 12

GUI-programmering, del 3

Vinduslyttere

Dialogvinduer

GUI-komponenten JTable

Egne datamodellklasser

LC191D Videregående programmering Semesterplan: http://aitel.hist.no/fag/vprg/index_LC191D.php

Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring

Else Lervik, februar 2012

en oversikt over kapittel 19 i boka
En oversikt over kapittel 19 i boka
  • Kap. 19 i boka – forelesning 29.02.2012:19.1 Menyer, les på egen hånd19.2 Knapperader, les på egen hånd19.3 Ulike typer vinduer, gjennomgås raskt19.4 Vinduslyttere, gjennomgås raskt 19.5 Dialogvinduer, gjennomgås grundig, inkl. oppgave side 651. Se også eksempel kap. 24.4, side 832-837. Kodedetaljene knyttet til knappene i MinDialog er ikke pensum.19.6 GUI-komponenten tabell (JTable), gjennomgås inkl. oppgave side 65419.7 GridBagLayout som layouthåndterer. Gjennomgås ikke. Ikke direkte pensum, men bør leses for å forstå det store eksemplet i boka.19.8 Oppussingseksemplet, del 4. Gjennomgås ikke pga størrelsen, men pensum. Eksempel på bruk av enum (kap. 15.6).19.9 Å lage egne datamodellklasser, pensum. Gjennomgår oppg. side 674 i stedet for det store eksemplet. (Se også løsningsforslaget øving 11.)
  • Enum – kapittel 15.6 – leses på egen hånd (ikke eksamensaktuelt).
vinduer i java
Vinduer i Java

Primærvindu (klassen JFrame) med

knapper for minimering, maksimering og lukking

og tittellinje

Sekundærvindu

(dialog, klassen JDialog),

lukkes dersom

foreldrevinduet

lukkes

Interne vinduer (klassen JInternalFrame)

med knapper for minimering, maksimering og lukking.

Ingen deler av et internt vindu kan vises utenfor

det primærvinduet det tilhører.

klassetreet med vindusklassene
Klassetreet med vindusklassene

Object

Component

Container

Window

JComponent

JWindow

Frame

Dialog

JInternalFrame

JFrame

JDialog

klassetreet med vindusklassene1
Klassetreet med vindusklassene

Object

De gamle AWT-klassenefor Button, Label, osv.er Componenter, men ikkeContainere.

set/getBackground() addFocusListener()setSize() setLocation() hasFocus()setLayout()add()

Component

Container

pack()addWindowListener()dispose()

Window

LookAndFeelToolTips

JComponent

setTitle()

JWindow

Frame

Dialog

JInternalFrame

De nye Swing-komponenteneligger under Jcomponent og er dermed også Containere

vinduer utenramme

JFrame

JDialog

add(), erstatter metoden arvet fra Container()setDefaultCloseOperation()

vinduslyttere
Vinduslyttere
  • Hittil
    • setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  • Av og til trenger vi selv å kontrollere lukkingen, for eksempel dersom filer skal lukkes:
    • setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
  • Interface java.awt.event.WindowListener:

void windowActivated(WindowEvent hendelse);

void windowClosed(WindowEvent hendelse);

void windowClosing(WindowEvent hendelse);

void windowDeactivated(WindowEvent hendelse);

void windowDeiconified(WindowEvent hendelse);

void windowIconified(WindowEvent hendelse);

void windowOpened(WindowEvent hendelse);

klassen windowadapter
Klassen WindowAdapter
  • Et vinduslytterobjekt må tilhøre en klasse som implementerer interfacet WindowListener
  • Vanligvis er de fleste metodene tomme
  • Det er derfor laget en adapter-klasse (gjelder alle awt-lytter-interface med mer enn én metode):

package java.awt.event;

public abstract class WindowAdapter implements WindowListener {

public void windowOpened(WindowEvent hendelse) {}

public void windowClosing(WindowEvent hendelse) {}

// ... og så videre, bare tomme metoder

}

  • Eksempel på bruk

private class Vinduslytter extends WindowAdapter {

public void windowClosing(WindowEvent hendelse) {

... sett inn kode her ...

dispose();

System.exit(0); // hvis programmet skal avsluttes

}

}

dialogvinduer eksempel se kode kap 24 4 side 832 837 men les kap 19 5 f rst
Dialogvinduer, eksempel se kode kap. 24.4, side 832-837, men les kap. 19.5 først

foreldrevindu med

to barnevinduer

Nytt navn skrives inn

og sendes tilbake til

hovedvinduet.

Navnet endres, og resultatet

sendes tilbake til hovedvinduet

dialogvinduer
Dialogvinduer
  • Et dialogvindu er et sekundærvindu, det vil si at det alltid bør være knyttet til et foreldrevindu.
  • Et modalt dialogvindu hindrer brukeren tilgang til andre vinduer så lenge dialogvinduet er åpent.
  • Ikke-modale vinduer er mer praktiske for brukeren, men krever mer av programmereren i og med at flere vinduer må holdes oppdatert på en gang.
meldingsutvekslingen i det aller enkleste dialogvinduet
Meldingsutvekslingen i det aller enkleste dialogvinduet

System.

out

foreldre-

vindu

knapp

knappelytter

dialog-

boks

okKnapp

knappelytter

”klient”

setVisible()

trykk

actionPerformed()

visDialog()

setVisible(true)

trykk

actionPerformed()

setVisible(false)

println(”OK trykket…”)

ikke retur før meldingen

setVisible(false) sendes

til dialogboksen

hvordan gj r vi det kort fortalt

Vis programliste 19.3 side 638-640

Hvordan gjør vi det, kort fortalt
  • Et dialogvindu er en subklasse til JDialog. Den må ha en konstruktør som kaller superklassen sin konstruktør med argumentet modal = true. (Standardkonstruktøren til JDialog lager en ikke-modal dialog.)
  • La hvert enkelt dialogvindu ha en metode med navn visDialog() e.l. Inne i denne metoden finner vi kallet setVisible(true). For modale dialogvinduer vil denne metoden ikke returnere før setVisible(false) er kalt.
  • All aktivitet i dialogen må avsluttes med kallet setVisible(false).
  • Lag foreldrevinduet med dialogene som objektvariabler.

Gjør oppgave 1 side 651:Endre programliste 19.3 slik at MiniDialog inneholder et tekstfelt som brukeren kan skrive i. Endre visDialog() slik at den returnerer denne teksten som en streng til foreldrevinduet dersom bruker trykker på OK-knappen. Hvis brukeren trykker på Avbryt-knappen, skal metoden returnere null. Foreldrevinduet skal skrive ut teksten rett under trykknappen "Trykk her!"

en standard ok avbryt dialog
En standard OK-Avbryt-dialog
  • OK betyr at endringene som er lagt inn i dialogvinduet skal gjelde.
  • Avbryt betyr at endringene ikke skal gjelde.
  • Vi lager en klasse som beskriver et dialogvindu med disse knappene og lar våre øvrige dialogvinduer være subklasser til denne.
  • Klassen heter MinDialog og ligger i pakken mittBibliotek.
  • Øvrig funksjonalitet:
    • Klassen inneholder metoden okData(). En subklasse kan lage sin egen utgave av denne metoden for kontroll av inndata. Dersom brukeren trykker OK vil ikke dette aksepteres dersom okData() returnerer false.
    • Dersom brukeren prøver å lukke vinduet ved å trykke i øverste høyre hjørne, vil spørsmålet ”Skal eventuelle registrerte data lagres?” komme. Hvis brukeren svarer ja, vil dataene lagres dersom okData() returnerer true.
    • OK-knappen er definert som standardknapp.
    • Escape-tasten er knyttet til Avbryt-knappen.

Vis programliste 19.4 side 643-645

tester persondialog
Tester PersonDialog

Foreldrevindu extends JFrame

PersonDialog extends MinDialog

JOptionPane,

kommer dersom brukeren

lukker navnedialogen

ved å trykke i

øverste høyre hjørne

Vis programliste 19.5 side 647-651

gui komponenten tabell klassen jtable
GUI-komponenten tabell (klassen JTable)
  • En tabell har kolonner og linjer. Kolonnene har navn.
  • Brukeren kan velge linjer i tabellen ved å klikke på dem.
  • Kan sette opp om det skal være mulig å velge kun én linje av gangen, ett intervall av linjer, eller flere intervall.
  • Valget håndteres omtrent på samme måte som for lister.
  • Standard er at brukeren velger linjer, ikke celler.
  • Brukeren kan endre dataene direkte i cellene.

Vis programliste 19.6

side 652-653.

Gjør oppgaven side 654:

Endre programmet foran slik at opplysninger om nye byer kan legges inn. Modellklassen du skal bruke, heter DefaultTableModel.

lage egne datamodellklasser
Å lage egne datamodellklasser
  • Trenger å forholde oss til den underliggende datamodellen når datainnholdet i GUI-komponentene liste (JList) og tabell (JTable) skal oppdateres
  • DefaultListModel og DefaultTableModelkan brukes
    • Da kopierer vi våre egne data inn i objekter av disse klassene
  • Kan også lage våre egne
    • En bedre og mer direkte løsning, da bruker vi våre egne klasser
  • Datamodell for JList
    • Subklasse til AbstractListModel
    • Må implementere ObjectgetElementAt(int indeks) og intgetSize()
    • Må varsle datamodellen når dataene er forandret:
      • protected metode fireIntervalAdded() (flere metoder, se online API-dok.)
      • kaller den fra en egenlaget offentlig metode
  • Datamodell for JTable
    • Subklasse til AbstractTableModel
    • Må implementere intgetColumnCount(), intgetRowCount() og ObjectgetValueAt(int rad, int kolonne)
    • Må varsle datamodellen når dataene er forandret: fireTableDataChanged() (flere metoder, se online API-dok.)
  • Kan selvfølgelig lage egne utgave av arvede metoder, dersom ønskelig

Gjør oppgaven side 674: I oppgaven på side 654 brukte du DefaultTableModel. Skift ut denne med en subklasse til AbstractTableModel.