Пример реализации раскрывающихся списков, наподобие проводника Windows(Использование класса JTree)
Приведу два примера созданных с помощью двух инструментов разработки JBuilder 5 и JСreator при помощи имеющихся стандартных заготовок application.
В JBuilder 5
Создаются два файла: класс содержащий метод main - Application1 и класс FrameTree
Application1
package sampletree; import javax.swing.UIManager; import java.awt.*; public class Application1 { boolean packFrame = false; public Application1() { FrameTree frame = new FrameTree(); if (packFrame) { frame.pack(); } else { frame.validate(); } Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); if (frameSize.height > screenSize.height) { frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); frame.setVisible(true); } public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { e.printStackTrace(); } new Application1(); } }
FrameTree
package sampletree; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.tree.*; public class FrameTree extends JFrame { DefaultMutableTreeNode level0 = new DefaultMutableTreeNode("Корень дерева"); JTree jt = new JTree(level0); public FrameTree() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { init(); } catch(Exception e) { e.printStackTrace(); } } private void init() throws Exception { this.setSize(new Dimension(400, 300)); this.setTitle("Tree Sample"); DefaultMutableTreeNode level1a; DefaultMutableTreeNode level1b; DefaultMutableTreeNode level1c; level1a = new DefaultMutableTreeNode("Первая ветвь"); DefaultMutableTreeNode level1a_1=new DefaultMutableTreeNode("Ветвь первой ветви"); level1a_1.add(new DefaultMutableTreeNode("Отросточек")); level1a.add(level1a_1); level1a.add(new DefaultMutableTreeNode("Отросточек")); level0.add(level1a); level1b = new DefaultMutableTreeNode("Вторая ветвь"); DefaultMutableTreeNode level1b_1=new DefaultMutableTreeNode("Первая ветвь второй ветви"); level1b_1.add(new DefaultMutableTreeNode("Первый отросточек")); level1b_1.add(new DefaultMutableTreeNode("Второй отросточек")); level1b.add(level1b_1); DefaultMutableTreeNode level1b_2=new DefaultMutableTreeNode("Вторая ветвь второй ветви"); level1b_2.add(new DefaultMutableTreeNode("Отросточек")); level1b.add(level1b_2); level0.add(level1b); level1c = new DefaultMutableTreeNode("Отросточек"); level0.add(level1c); this.getContentPane().add(jt); } protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } } }
В JСreator
Всё делается в одном файле:
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.tree.*; class TreeSample extends JFrame { DefaultMutableTreeNode level0 = new DefaultMutableTreeNode("Корень дерева"); JTree jt = new JTree(level0); public TreeSample() { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } }); init(); } public static void main(String args[]) { System.out.println("Starting TreeApplic..."); TreeSample mainFrame = new TreeSample(); mainFrame.setSize(400, 300); mainFrame.setTitle("Tree sample"); mainFrame.setVisible(true); } public void init() { this.setSize(new Dimension(400, 300)); this.setTitle("Tree Sample"); DefaultMutableTreeNode level1a; DefaultMutableTreeNode level1b; DefaultMutableTreeNode level1c; level1a = new DefaultMutableTreeNode("Первая ветвь"); DefaultMutableTreeNode level1a_1=new DefaultMutableTreeNode("Ветвь первой ветви"); level1a_1.add(new DefaultMutableTreeNode("Отросточек")); level1a.add(level1a_1); level1a.add(new DefaultMutableTreeNode("Отросточек")); level0.add(level1a); level1b = new DefaultMutableTreeNode("Вторая ветвь"); DefaultMutableTreeNode level1b_1=new DefaultMutableTreeNode("Первая ветвь второй ветви"); level1b_1.add(new DefaultMutableTreeNode("Первый отросточек")); level1b_1.add(new DefaultMutableTreeNode("Второй отросточек")); level1b.add(level1b_1); DefaultMutableTreeNode level1b_2=new DefaultMutableTreeNode("Вторая ветвь второй ветви"); level1b_2.add(new DefaultMutableTreeNode("Отросточек")); level1b.add(level1b_2); level0.add(level1b); level1c = new DefaultMutableTreeNode("Отросточек"); level0.add(level1c); this.getContentPane().add(jt); } }
Рассматривать полностью весь пример, мы не будем, а рассмотрим саму реализацию иерархической системы данных в виде дерева.
Первые две строчки
DefaultMutableTreeNode level0 = new DefaultMutableTreeNode("Корень дерева"); JTree jt = new JTree(level0);
DefaultMutableTreeNode - узел общего назначения в структуре данных дерева.
JTree - дерево отображающие иерархическую систему данных.
Этими манипуляциями мы создаём дерево с одной ветвью(узлом).
Далее создаём ещё дополнительно три узла для одновременной манипуляции над ними.
DefaultMutableTreeNode level1a; DefaultMutableTreeNode level1b; DefaultMutableTreeNode level1c;
Создаём первый узел(первую ветвь).
level1a = new DefaultMutableTreeNode("Первая ветвь");
Создаём под узел.
DefaultMutableTreeNode level1a_1=new DefaultMutableTreeNode("Ветвь первой ветви");
Создаём в под узеле конечный узел.
level1a_1.add(new DefaultMutableTreeNode("Отросточек"));
Добавляем под узел в первый узел.
level1a.add(level1a_1);
Создаём в первом узле ещё и конечный узел.
level1a.add(new DefaultMutableTreeNode("Отросточек"));
Добавляем весь первый узел в корневой узел.
level0.add(level1a);
Проделываем похожие действия со вторым узлом, где в отличии от первого, вместо конечного узла добавляется узел содержаший в себе конечный узел.
level1b = new DefaultMutableTreeNode("Вторая ветвь"); DefaultMutableTreeNode level1b_1=new DefaultMutableTreeNode("Первая ветвь второй ветви"); level1b_1.add(new DefaultMutableTreeNode("Первый отросточек")); level1b_1.add(new DefaultMutableTreeNode("Второй отросточек")); level1b.add(level1b_1); DefaultMutableTreeNode level1b_2=new DefaultMutableTreeNode("Вторая ветвь второй ветви"); level1b_2.add(new DefaultMutableTreeNode("Отросточек")); level1b.add(level1b_2); level0.add(level1b);
Потом также добавляем конечный узел в корневой узел.
level1c = new DefaultMutableTreeNode("Отросточек"); level0.add(level1c);
И теперь всё полученное дерево приспосабливаем на форму.
this.getContentPane().add(jt);
JAR-архивы:
SampleTree.jar
TreeSample.jar
java-файлы:
Application1.java
FrameTree.java
TreeSample.java