Takaisin luentomateriaaliin

Komponenttien haku

Jos ikkunaan luo useamman komponentin, joihin kaikkiin tarvitsee myöhemmin viitteen, luokan muuttujien määrä kasvaa herkästi varsin suureksi ja koodi void käydä sekavaksi. Joskus voi olla käytännöllisempää säilyttää viitteitä joihinkin Containereihin ja näiden kautta hakea Containerin sisältämiä komponentteja.

Containerin yksi ominaisuus on, että siihen talletetaan tieto kaikista sen sisältämistä komponenteista listaan ja myöhemmin komponentteja voi hakea indeksin perusteella getComponent-metodilla. Normaalisti komponentit menevät tälle listalle siinä järjestyksessä kuin komponentteja lisätään, mutta lisätessä on myös mahdollista sanoa mihin kohtaan listaa komponentti lisätään. getComponents-metodi palauttaa Containerin sisältämät komponentit listana.

import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Esimerkki extends Runnable {

    private JFrame kehys;
    private Container alusta;

    @Override
    public void run() {

      luoIkkuna();

      this.alusta = new Container();
      this.alusta.setLayout(new GridLayout(5,1));
      this.kehys.add(this.alusta);

      for (int i=0; i<5; i++) {

        JButton nappula = new JButton();
        this.kehys.add(nappula);
      }

      vaihdaNappulojenTekstit();

    }

    public void vaihdaNappulojenTekstit() {

      int i=1;

      for (Component komponentti : this.alusta.getComponents()) {

        JButton nappula = (JButton)komponentti;
        nappula.setText("" + i);

        i++;

      }
    }
}

Kuten esimerkissä näkyy getComponents-metodin palauttaman listan alkiot ovat Component-tyyppisiä. Tällä kertaa tiedettiin, että kaikki komponentit ovat JButton tyyppisiä, joten tyyppimuunnos (typecasting), (JButton), voitiin tehdä.

Huomaa, että jos käydään läpi JFramen sisältämiä komponentteja niin komponentit tulee pyytää JFrame.getContentPane()-metodin kautta, koska komponentteja ei lisätä suoraan JFrameen vaan JRootPane-olioon.

instanceof

Jos Container sisältäisi muitakin komponentteja kuin JButtoneita voitaisiin getComponents-metodin palauttamaa listaa läpi käydessä tarkistaa ensin, että komponentti on oikean tyyppinen. Tämä voi olla hyvä lisätä ohjelmaan joka tapauksessa virhetapausten varalta. Seuraavana edellisen esimerkin vaihdaNappulojenTekstit-metodi paranneltuna:

public void vaihdaNappulojenTekstit() {
    int i=1;

    for (Component komponentti : this.alusta.getComponents()) {

      if (komponentti instanceof JButton) {
        JButton nappula = (JButton)komponentti;
        nappula.setText("" + i);

        i++;

      }
    }
}

Takaisin luentomateriaaliin


Viimeksi muokattu 2.7.2012