![]() |
![]() |
Start på kapittel om grafiske brukergrensesnitt |
Kombobokser er et alternativ til radioknapper for å velge nøyaktig ett alternativ fra en gruppe. I en komboboks er bare ett alternativ - det valgte - synlig om gangen. Lista over de andre alternativene ruller seg ned som en rullgardin på skjermen når vi klikker på den knappen som komboboksen er utstyrt med. Kombobokser er derfor et aktuelt alternativ til radioknapper når det er behov for å spare på plassen på skjermen, eller når det ikke er så stort behov for å vise fram på skjermen alle valgalternativene hele tida.
Kombobokser finnes i to svært forskjellige versjoner: ikke-editerbare og editerbare. Defaulttypen av komboboks er ikke-editerbar og det er bare denne typen vi skal ta for oss.
Fra og med javaversjon 7 er
JComboBox<E>
-klassen definert
som en parametrisert klasse. Det eneste man vinner på dette er stort sett å slippe
typekonvertering på returen fra én av de mest aktuelle metodene, se nedenfor. Så det går
fortsatt fint an å bruke klassen uten typeparameter. I eksemplet nedenfor
blir typeparameter brukt. (For nærmere beskrivelse av parametriserte typer, se
Bruk av generiske datatyper.)
En komboboks kan opprettes på flere forskjellige måter. Dette er de to mest aktuelle måtene (uttrykt i pseudo-kode):
String[] alternativer = { < liste av navn > }; JComboBox<String> komboboks = new JComboBox<>(alternativer); //kan eventuelt droppe typeparameter
eller
JComboBox<String> komboboks = new JComboBox<>(); komboboks.addItem( "< navn >" ); komboboks.addItem( "< navn >" ); ...
Her er det brukt tekst som valgalternativer. Men vi kunne like godt brukt ikoner isteden. I prinsippet er det mulig å legge inn hvilken som helst type objekter som alternativer, men dersom det blir brukt annet enn tekst eller ikoner (bilder), er det nødvendig med mer programmering enn det som er tatt med her.
Hver gang brukeren klikker på et alternativ fra komboboksens meny, blir det
generert en ActionEvent
. Dersom det valgte alternativet er forskjellig
fra det forrige som ble valgt, vil det dessuten bli generert to
ItemEvent
'er: en for det nye alternativet som nå ble valgt og en
for det gamle alternativet som nå ble av-valgt. (Dersom brukeren velger samme
alternativ som allerede er valgt, blir det ikke generert noe
ItemEvent
.)
Komboboksmetoden getSelectedItem
returnerer det valgte
alternativet i form av et Object
-objekt
(også når det blir brukt typeparameter).
Metoden getSelectedIndex
returnerer indeksen (fra 0 og oppover) for
det valgte alternativet.
Metoden getItemAt(indeks)
returnerer
alternativet på den indeksplassen som parameteren angir, eller
null
dersom denne indeksen
er utenfor gyldig indeksintervall. Dersom det blir brukt typeparameter for
komboboksen, vil returtypen være den datatypen som er brukt som aktuell typeparameter.
Dersom det ikke blir brukt typeparameter, vil returen fra metoden være av type
Object
. Typekonvertering vil det da som regel være nødvendig å foreta.
Metoden setMaximumRowCount(n)
(der n
er en
int
-parameter) kan brukes til å bestemme hvor mange alternativer
som skal være synlige når det blir klikket på komboboksen. Dersom det totalt
er flere alternativer enn det antall som er bestemt, vil komboboksen
automatisk bli utstyrt med skrollefelt. Default-verdien for
MaximumRowCount
er plattformavhengig.
I programmet
Komboboksdemo.java
,
som er hentet fra The Java Tutorials og litt tilpasset, blir en komboboks brukt til å velge hvilket av bildene
Fugl.gif,
Katt.gif,
Hund.gif,
Gris.gif,
Kanin.gif
som skal vises i en bilde-label. Bildefilene må ligge i en
underkatalog bilder
under katalogen der programmets class-filer ligger.
Et av vinduene vil se slik ut,
med komboboksen til venstre for det valgte bilde:
Programkoden for vinduet er gjengitt nedenfor. Driverklasse for programmet
finnes i fila
Kombobokstest.java
.
1 import java.awt.*; 2 import java.awt.event.*; 3 import javax.swing.*; 4 5 public class Komboboksdemo extends JFrame 6 { 7 JLabel bilde; 8 9 public Komboboksdemo() 10 { 11 super( "Komboboksdemo" ); 12 String[] dyrenavn = {"Fugl", "Katt", "Hund", "Kanin", "Gris"}; 13 14 // Oppretter komboboks, velger gris som startbilde 15 JComboBox<String> dyrevelger = new JComboBox<>(dyrenavn); 16 dyrevelger.setSelectedIndex(4); 17 dyrevelger.addActionListener( new ActionListener() { 18 public void actionPerformed(ActionEvent e) 19 { 20 int n = dyrevelger.getSelectedIndex(); 21 String dyrenavn = dyrevelger.getItemAt(n); 22 bilde.setIcon( new ImageIcon( 23 getClass().getResource("bilder/" + dyrenavn + ".gif")) ); 24 } 25 }); 26 27 // Oppretter bilde-label 28 bilde = new JLabel(new ImageIcon( 29 getClass().getResource("bilder/" + 30 dyrenavn[ dyrevelger.getSelectedIndex() ] + ".gif")) ); 31 Container c = getContentPane(); 32 c.setLayout( new FlowLayout() ); 33 c.add( dyrevelger ); 34 c.add( bilde ); 35 } 36 }
Det er tillatt å endre under programkjøring hvilke valgalternativer en komboboks skal
inneholde. Metoden addItem(E item)
tilføyer et nytt valgalternativ på slutten av valglista.
Vi kan velge plassering av alternativet ved å bruke metoden
insertItemAt(E item, int index)
isteden. På begge disse metodene er datatypen for objektet som skal tilføyes
lik Object
dersom det ikke er brukt typeparameter. Det betyr jo
at hvilken som helst type objekt i så fall kan tilføyes ved bruk av metodene,
mens datatypen i tilfelle det brukes typeparameter må være kompatibel med den typen
som er brukt som aktuell typeparameter.
Tilsvarende metoder for å fjerne
et alternativ, er removeItem(Object anObject)
og
removeItemAt(int anIndex)
. Det er også mulig å fjerne alle eksisterende alternativer
ved å bruke metoden removeAllItems
. Men merk at i tilfelle endring av valgalternativer,
så vil ikke endringen blir synlig på skjermen uten at vi har en instruksjon for få tegnet ut
på nytt vedkommende komboboks. Det kan du få til ved å gjøre kall på vinduets validate
-metode.
Copyright © Kjetil Grønning, revidert av Eva Hadler Vihovde 2014
![]() |
![]() |
Start på kapittel om grafiske brukergrensesnitt |