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