Forrige avsnitt Neste avsnitt Start på kapittel om grafiske brukergrensesnitt

Kombobokser

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.

Programeksempel

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 }

Redigering av alternativer

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

Forrige avsnitt Neste avsnitt Start på kapittel om grafiske brukergrensesnitt