5.2 Jäsenen haku lomakkeelle

Tee uusi ikkuna, johon kuuluu JTable-elementti ja kaksi nappia 'Hae' ja 'Valitse'.

'Hae' -nappia painettaessa kutsutaan Jasen-luokan metodia haeKaikki(). JTable-elementin tiedot korvataan haetun tulosjoukon tiedoilla.

'Valitse' -nappia painettaessa päivitetään valitun rivin tiedot aiemmin tehdylle jäsenen tiedot -lomakkeelle toiseen ikkunaan; jossa ao. jäsenen tietoja voidaan päivittää, etc.


Ohjeita JTable:n käyttöön

Periaatteessa sopivalle JTable:n constructorille voi antaa parametrina (Vector:ina tai Object[][] -taulukkona) JTable-elementissä näytettävän datan. (ks. javax.swing.JTable). Tällöin kuitenkin JTable:ssa näkyvä data on staattista, ts. sitä ei voi muuttaa (muutoinkuin poistamalla vanhan JTable-elementin lomakkeelta ja sijoittamalla sinne uuden).

Sen sijaan JTable:lle voidaan antaa parametrin oma TableModel -rajapinnan toteuttava tai AbstractTableModel -luokasta peritty luokka.

Esimerkki TableModel -luokasta:

public class PerusTableModel extends AbstractTableModel {

  // Sarakkeiden otsikot voivat olla esim. String[] -arrayssä

  // Taulun data voi olla esim. Vector:ssa tai Object[][] -arrayssä.

  public PerusTableModel( String[] p_sOtsikot  ) {
    super();

    .....
  }

  /**
   * Palauttaa taulun sarakkeiden määrän. Swing-oliot kutsuvat.
   */
  public int getColumnCount() {
    ....
  }
                  
  /**
   * Palauttaa taulun rivien määrän. Swing-oliot kutsuvat.
   */
  public int getRowCount() {
     ....
  }

  /**
   * Palauttaa sarakkeen nimen. Swing-oliot kutsuvat.
   */
  public String getColumnName(int iCol) {
     ....
  }

  /**
   * Palauttaa solun arvon. Swing-oliot kutsuvat.
   */
  public Object getValueAt(int row, int col) {
    ....
  }

  /**
   * Palauttaa sarakkeen luokan. Swing-oliot kutsuvat. c == sarakkeen nro.
   */
  public Class getColumnClass(int c) {
    ....
  }

  /**
   * Voiko käyttäjä muuttaa tietyn solu arvoa? Swing-oliot kutsuvat.
   */
  public boolean isCellEditable(int row, int col) {
    ....
  }

  /**
   * Asettaa tietyn solun arvon. Swing-oliot kutsuvat, kun käyttäjä on muuttanut
   * solun arvoa.
   */
  public void setValueAt(Object value, int row, int col) {
    ....
  }

}

Ylläolevat metodit siis täytyy toteuttaa, jotta luokka kelpaisi TableModel:ksi. Tässä tapauksessa tarvittaneen lisäksi esim. metodeja, joilla saadaan ohjelmallisesti päivitettyä TableModel:iin uudet arvot.

Käytettäessä TableModel -luokkaa, saadaan koko taulun arvot vaihdettua seuraavilla käskyillä:

    js.getViewport().setBackingStoreEnabled(false);
    jt.clearSelection();
    js.getViewport().setViewPosition(new Point(0,0));
    jt.tableChanged(new TableModelEvent( model ));
    js.getViewport().setBackingStoreEnabled(true);

    missä: 

    jt == JTable
    js == JScrollPane (jos JTable on sijoitettu JScrollPane:n sisälle)
    model == TableModel