Komponent JTree i jego model w języku programowania Java

Transkrypt

Komponent JTree i jego model w języku programowania Java
11.05.2012
Paweł Zwanitaj
Komponent JTree i jego model w języku
programowania Java
1. Wstęp
Drzewo to struktura danych przedstawiona hierarchicznie. Zbudowana
jest z powiązanych ze sobą węzłów (ang. Node). Wśród wszystkich węzłów
możemy wyróżnić korzeń (ang. Root), który jest pierwszy w hierarchii węzłów.
Reprezentuje on początek struktury, dlatego też jest najwyższym węzłem
nadrzędnym. Możemy wyróżnić też węzły nie będące dla żadnego innego
węzła w hierarchii, węzłem nadrzędnym. Takie skrajne węzły w strukturze
nazywamy liściami (ang. Leaf). W sytuacji gdy posiadamy wiele drzew w
strukturze nazywamy taki zbiór lasem.
JTree jest klasą należącą do pakietu Tree w języku Java, realizującą
zagadnienie drzewa oraz operacji na nim.
2. Pakiet Tree
Pakiet Tree jest zbiorem klas oraz interfejsów będących niezbędnym
mechanizmem komponentu JTree w języku programowania Java. Każda
składowa odpowiada za inny element
tego komponentu oraz jego
funkcjonalność. Pakiet Tree zawiera w sobie takie klasy oraz interfejsy jak:
·
·
·
·
·
·
·
·
·
·
JTree
TreePath
TreeNode
TreeModel
TreeCellRenderer
TreeCellEditor
TreeSelectionModel
TreeSelectionListener
TreeExpansionListener
ExpandVetoException
JTree jest przykładem zastosowania wzorcu projektowego Model –
Widok – Kontroler (ang. Model-View-Controller). Jest to klasa zawarta w
bibliotece Swing, przeznaczonej do tworzenia aplikacji okienkowych.
3. Tworzenie JTree
Obiekt drzewa możemy stworzyć na trzy różne sposoby.
Pierwszym ze sposobów jest stworzenie drzewa w oparciu o węzeł czyli
obiekt klasy TreeNode. Jednak musimy zauważyć że podany węzeł zostanie
potraktowany jako korzeń drzewa i zostanie umieszczony na szczycie
hierarchii. Aby rozwijać swój węzeł możemy skorzystać z metody
add(TreeNode node), i stworzyć hierarchię węzłów. Poniższy fragment kodu
obrazuje
nam
tworzenie
prostego
drzewa
za
pomocą
klasy
DefaultMutableTreeNode.
DefaultMutableTreeNode korzen = new DefaultMutableTreeNode(“Rośliny”);
DefaultMutableTreeNode drzewa = new DefaultMutableTreeNode(“Drzewa”);
korzen.add(drzewa);
DefaultMutableTreeNode iglaste = new DefaultMutableTreeNode(“Iglaste”);
drzewa.add(iglaste);
DefaultMutableTreeNode lisciaste = new DefaultMutableTreeNode(“Liściaste”);
drzewa.add(liscicaste);
JTree tree = new JTree(korzen);
Wygląd powyższego drzewa:
Drugim sposobem stworzenia drzewa jest skorzystanie z dostarczonych
konstruktorów, przeznaczonych do utworzenia na podstawie kolekcji
elementów lub tablicy obiektów. Jednakże budowa takiego drzewa może
okazać się nieefektywna z powodu trudności odwzorowania hierarchii z
tablicy lub kolekcji elementów. W wyniku takiego działania możemy otrzymać
las drzew z jednym elementem zamiast oczekiwanego drzewa. Poniższy
przykład zobrazuje prawidłowe utworzenie drzewa za pomocą kolekcji
Hashtable.
Hashtable drzewa = new Hashtable();
drzewa.put("Lisciaste",new String[]{"Buk","Lipa","Klon","Kasztan"});
drzewa.put("Iglaste",new String[]{"Sosna","Świerk"});
JTree tree = new JTree(drzewa);
Wygląd powyższego drzewa:
Trzecim i ostatnim sposobem jest utworzenie drzewa w oparciu o model
danych. Interfejs TreeModel umożliwia napisanie własnej klasy modelu
danych. Dodatkowo Java udostępnia gotową klasę DefaultTreeModel, która
jest przykładem implementacji wyżej wymienionego interfejsu. Taki model
tworzymy na podstawie obiektu TreeNode i zbudowanej w nim hierarchii.
Największą zaletą jest dostęp do opisanych w następnym punkcie metod
obsługi modelu danych.
DefaultMutableTreeNode korzen = new DefaultMutableTreeNode(“Rośliny”);
DefaultMutableTreeNode drzewa = new DefaultMutableTreeNode(“Drzewa”);
korzen.add(drzewa);
DefaultMutableTreeNode iglaste = new DefaultMutableTreeNode(“Iglaste”);
drzewa.add(iglaste);
DefaultMutableTreeNode lisciaste = new DefaultMutableTreeNode(“Liściaste”);
drzewa.add(liscicaste);
DefaultTreeModel model = new DefaultTreeModel(korzen);
JTree tree = new JTree(model);
Wygląd powyższego drzewa:
4. Interfejs TreeModel
Interfejs TreeModel jest doskonałym rozwiązaniem dla aplikacji
wymagających bardziej zaawansowanych rozwiązań i możliwości. Według
zasad implementowania interfejsów w Javie musimy umieścić w naszej klasie
następujące metody zadeklarowane przez producenta:
·
·
·
·
·
·
·
·
Object getRoot()
int getChildCount(Object parent)
int getChild(Object parent, int index)
int get IndexOfChildChild(Object parent, Object child)
boolean isLeaf(Object node)
void addTreeModelListener(TreeModelListener listener)
void removeTreeModelLIstener(TreeModelListener listener)
void valueForPathChanged(TreePath path, Object newValue)
5. Bibliografia
·
,,Java. Techniki zaawansowane. Wydanie VIII” – Cay S. Horstmann,
Gary Cornel
·
http://java.sun.com/products/jfc/tsc/articles/jtree/
·
http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/JTree.html