JList
Jedná se o víceřádkovou komponentu představující seznam. Na rozdíl od JcomboBoxu umožňuje trvale zobrazit celý seznam a nejen pouze jednu jeho položku. V případě, že je délka seznamu větší než délka komponenty nebo šířka položky větší než šířka komponenty, pro listování jsou použity scrollbary.Výběr ze seznamu. Pro výběr ze seznamu je používána instance třídy ListSelectionModel.
Výběr ze seznamu lze provádět třemi způsoby:
Nejčastěji je používána první varianta. Způsob výběru lze nastavit metodou setSelectionMode(int const) za požití jedné ze tří níže uvedených konstant:
SINGLE_SELECTION
SINGLE_INTERVAL_SELECTION
MULTIPLE_INTERVAL_SELECTION.
Třída má k dispozici několik konstruktorů, uvedeme:
JList();
JList(vector v);
První konstruktor vytvoří prázdný seznam, druhý seznam naplněný položkami vectoru.
Přidávání položek do seznamu. Přidávání položek do seznamu je možné provádět dvěma způsoby.
V dalším výkladu naznačíme stručně obě varianty. Třída JList obsahuje mnoho metod, přehled nejčastěji používaných nalezneme v tabulce.
Metoda | Popis |
addElement(Object o) | Přidání položky do seznamu (s využitím modelu). |
add(Component c) | Přidání položky do seznamu (bez využití modelu). |
setVisibleRowCount(int rows) | Nastavení počtu současně viditelných řádek seznamu. |
getVisibleRowCount() | Získání počtu současně viditelných řádek seznamu. |
setSelectedMode(ListModel l) | Nastavení způsobu výběru položek na jednu ze tří výše uvedených. |
setSelectedIndex(int) | Nastavení vybrané položky seznamu. |
setSelectedIndices(int[]) | Nastavení více vybraných položek seznamu. |
getSelectedIndex() | Index vybrané položky v seznamu. |
int[] getSelectedIndices() | Index vybraných položek seznamu uložený v poli. |
getSelectedValues() | Vrací seznam všech označených hodnot. |
setListData(Object o) | Do seznamu vloží požadovaná data. |
clearSelection() | Smazání všech smazaných položek seznamu. |
removeAll() | Smazání všech položek seznamu. |
isSelectionEmpty() | Zjistí, zda byla vybrána nějaká položka. |
Při práci se seznamy jsou používány dvě rozhraní ActionListener a ItemListener. Událost ItemEvent je generována při jednom kliknutí na položku seznamu, událost ActionEvent při dvojkliku na některou z položek seznamu. V následujícím příkladu vytvoříme dva seznamy. V druhém seznamu budou znázorněny všechny
položky, které budou v prvním seznamu zvýrazněny. V tomto případě budeme tedy pro JList používat rozhraní ItemListener (na položky nebudeme klikat dvojklikem, ale pouze je vybírat).
Přidání dat do seznamu s použitím modelu. V tomto případě využíváme rozhraní ListModel. Jeho implementací je třída DefaultListModel, která disponuje několika metodami pro práci s modelem. V prvním kroku vytvoříme instanci třídy DefaultListModel.
DefaultListModel lm=new DefaultListModel();
dalším kroku použijeme metodu addElement() a přidáme do ní pět prvků.
lm.addElement("Prvni polozka");
lm.addElement("Druha polozka");
lm.addElement("Treti polozka");
lm.addElement("Ctvrta polozka");
lm.addElement("Pata polozka");
V dalším kroku vytvoříme novou instanci třídy JList (v našem případě dvě) a metodou setSelectionMode nastavíme způsob výběru položek v komponentě.
l1=new JList();
l2=new JList();
l1.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
l2.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
Vytvořený model následně spojíme se seznamem.
l1.setModel(lm);
Mohli bychom použít i explicitní konstruktor
l1=new JList(lm);
Přidání dat do seznamu bez použití modelu Nejprve vytvoříme stejně jako v předchozím případě obě instance třídy JList. Přidání položek do seznamu provedeme takto:
lm.add("Prvni");
lm.add("Druhy");
lm.add("Treti");
lm.add("Ctvrty");
lm.add("Paty");
Další postup bude v obou případech stejný. V handleru obsluhujícím událost ActionEvent zjistíme metodou getSelectedValues() všechny zvýrazněné položky a za použití metody setListData(Object o) je nastavíme druhému seznamu.
public void cPrevod(ActionEvent e)
{
Object [] o=l1.getSelectedValues();
l2.setListData(o);
}
Ukázka zdrojového kódu:
public class Lists extends JFrame
{
private JList l1, l2;
private JButton b;
public Lists(int vyska, int sirka) {
this.setSize(vyska, sirka);
this.setTitle("List");
l1=new JList();
l2=new JList();
JScrollPane sp = new JScrollPane(l1,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
DefaultListModel lm=new DefaultListModel();
lm.addElement("Prvni polozka");
lm.addElement("Druha polozka");
lm.addElement("Treti polozka");
lm.addElement("Ctvrta polozka");
lm.addElement("Pata polozka");
b=new JButton("Napln");
l1.setModel(lm);
JScrollPane sp2 = new JScrollPane(l2,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
this.getContentPane().add(l1);
this.getContentPane().add(b);
this.getContentPane().add(l2);;
this.setLayout(new FlowLayout());
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cPrevod(e);
}
});
this.setVisible(true);
}
public void cPrevod(ActionEvent e)
{
Object [] o=l1.getSelectedValues();
l2.setListData(o);
}
}
Scrollování seznamem. Pokud je seznam dlouhý, je vhodný umožnit jeho scrollování, tj. posunování obsahu seznamu prostřednictvím komponenty JscrollPane. Scrollování může být jak vodorovné, tak svislé.
Komponenta má několik konstruktorů, z nichž nejčastěji je používán tento JScrollPane(Component c, int vertical, int horizontal);
Je vytvořen nový scrollovací panel scrollující obsahem zadané komponenty ve směru horizontálním, vertikálním, obou či žádném na základě hodnot proměnných vertical a horizontal. Ty mohou nabývat následujících hodnot.
Vytvoříme nový scrollovací panel, který bude pohybovat obsahem seznamu v obou směrech. Výsledek bude vypadat takto.
JScrollPane sp1 = new JScrollPane(l1,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
dalším kroku již nesmíme na ContentPane formuláře přidat seznam, ale jen nově vytvořený scrollovací panel. Stejným způsobem postupujeme i v případě druhého ListBoxu.
JScrollPane sp1 = new JScrollPane(l1,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
JScrollPane sp2 = new JScrollPane(l2,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
this.getContentPane().add(sp1);
this.getContentPane().add(b);
this.getContentPane().add(sp2);
Komponenty s posuvníky vypadají estetičtěji.
Autor: Filip Koval