Jak použít JList? - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Java

Jak použít JList?

9. února 2001, 00.00 | Popis komponenty JList knihovny SWING jazyka Java. Krok za krokem vám ukážeme použití této komponenty včetně ukázkového zdrojového kódu.

JList je komponenta knihovny SWING, která slouží k zobrazení seznamu. Použití této komponenty je poměrně univerzální.

Nejprve si vysvětlíme, jak tuto komponentu naplnit. Jednou z možností je předat jí při vytváření odkaz na objekt implementující interface ListModel, tento objekt obsahuje položky, které by se měly v seznamu objevit. Vytvořme například třídu MujListModel následovně:

class MujListModel extends AbstractListModel {
  private Vector objekty;
  public MujListModel() {
    objekty = new Vector();
  }
  public void pridej(Object ob) {
    objekty.addElement(ob);
  }
  public Object getElementAt(int index) {    
    return objekty.elementAt(index);
  }
  public int getSize() {
    return objekty.size();
  }
}

Pracujeme se seznamem libovolných objektů. Tyto objekty se všechny objeví v našem JListu. Důležité je implementovat metody getElementAtgetSize, aby bylo jasné, jaké objekty musejí být zobrazeny a kolik jich je.

Příklad použití by mohl být například následující:

import java.awt.*;
import java.util.*;
import javax.swing.*
public class Seznam extends JFrame {
  public Seznam() {
    MujListModel listModel = new MujListModel();
    listModel.pridej(new String("První"));
    listModel.pridej(new String("Druhý"));
    JList list = new JList(listModel);
    this.getContentPane().setLayout(new BorderLayout());
    this.getContentPane().add(list);
    this.setSize(new Dimension(400, 300));
    this.setTitle("Seznam");
  }
  static public void main(String[] args) {
    Seznam sez = new Seznam();
    sez.show();
  }
}
Vytvořili jsme nový MujListModel, do něj jsme přidali dva řetězce, vytvořili JList a ten umístili na obrazovku, celý kód je k dispozici na Seznam.java. Třída MujListModel je potomkem třídy AbstractListModel, která implementuje některé metody rozhraní ListModel.

Všechno to funguje bezvadně, problém nastane, když chceme, aby seznam obsahoval objekty jiného typu než String. Zobrazování vypadá potom tak, že při vykreslování jednotlivých řádků je vždy použita metoda toString() daného objektu. Tato metoda ale nemusí vždy vypisovat právě to, co chceme vypsat my, vůbec se zde nenabízí možnost měnit zobrazený text (pokud by např. objekt obsahoval nějaké informace o osobách, mohli bychom někdy chtít zobrazit pouze příjmení, někdy křestní jména a příjmení a někdy jen příjmení a rodná čísla). Řešení se nabízí v implementaci rozhraní ListCellRenderer. Uvedené rozhraní obsahuje pouze jedinou metodu, getListCellRendererComponent, která vrací komponentu, jež bude zobrazena v příslušném řádku JListu, obvykle se jedná o komponentu JLabel. Metoda getListCellRendererComponent má následující parametry:

  • JList list
  • Object value
  • int index
  • boolean isSelected
  • boolean hasFocus

Význam uvedených parametrů je poměrně zřejmý, list je celý seznam, value je hodnota v příslušném řádku, její index v seznamu, isSelected je true, pokud je hodnota vybrána a hasFocus nabývá true, jestliže má hodnota focus. Nyní bychom v závislosti na těchto parametrech měli vytvořit objekt typu JLabel a nastavit u něj barvu pozadí a další vlastnosti (podle toho, jestli je vybrán atd.).

Nastavování všech jeho vlastností by mohlo být nepohodlné, my můžeme využít toho, že třída DefaultListCellRenderer již tuto metodu implementuje a tak si ušetřit práci. Zavoláme metodu předka a jediné, co změníme, bude text v komponentě typu JLabel. Vše si ukážeme na zmiňovaném příkladu s lidmi.

class Osoba
  private String jmeno, prijmeni, rodneCislo
  public Osoba(String jmeno, String prijmeni, String rodneCislo) {
    this.jmeno = jmeno;
    this.prijmeni = prijmeni;
    this.rodneCislo = rodneCislo;
  }
  public String getJmeno() {
    return jmeno;
  }
  public String getPrijmeni() {
    return prijmeni;
  }
  public String getRodneCislo() {
    return rodneCislo;
  }
}
 
class MujListCellRenderer extends DefaultListCellRenderer {
   public Component getListCellRendererComponent(JList list,
    Object value,int index,
    boolean isSelected, boolean hasFocus)
    JLabel label = (JLabel) super.getListCellRendererComponent(list,

                     value, index, isSelected, hasFocus);
    Osoba osoba = (Osoba) value;
      label.setText(osoba.getPrijmeni());
    return label;
  }
}

V uvedeném příkladě bude zobrazeno pouze příjmení. Zde se nabízí použít větvení a na základě hodnoty nějaké proměnné zobrazit právě ty údaje, které jsou požadovány.

Zbytek programu by mohl vypadat například následovně:

public class Seznam2 extends JFrame {
  public Seznam2() {
    MujListModel listModel = new MujListModel();
    listModel.pridej(new Osoba("Jan", "Koníček", "7001012000"));
    listModel.pridej(new Osoba("Josef", "Ptáček", "6612061011"));
    JList list = new JList(listModel);
    MujListCellRenderer mujRenderer = new MujListCellRenderer();
    list.setCellRenderer(mujRenderer);
    this.getContentPane().setLayout(new BorderLayout());
    this.getContentPane().add(list);
    this.setSize(new Dimension(400, 300));
    this.setTitle("Seznam 2");
  }
  static public void main(String[] args) {
    Seznam2 sez = new Seznam2();

    sez.show();
  }
}

Doufám, že mi čtenář odpustí, že rodné číslo není číslo, ale řetězec. Kompletní program je Seznam2.java.

V hotových programech se většinou setkáme s tím, že JList obsahuje posuvníky (scrollbary), při používání SWINGu se tento problém řeší tak, že JList umístíme na objekt typu JScrollBar. V následujícím příkladě je úmyslně celé okno programu velmi malé, aby byly posuvníky dobře vidět. Řádek

    this.getContentPane().add(list);

nahradíme dvěma řádky:

    JScrollPane scrollPane = new JScrollPane(list);

    this.getContentPane().add(scrollPane);

Celý příklad Seznam3.java je vidět na obrázku.

Více o použití komponent z knihovny SWING snad zase někdy příště.

Tématické zařazení:

 » Rubriky  » Java  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: