Компонент JGraphTree

Компонент JGraphTree позволяет отрисовывать деревья, представленные стандартным интерфейсом TreeModel, в виде графа. Компонент писался под собственные нужды и на идеальное исполнение не претендует. Архив с исходным кодом, документацией и библиотекой с компонентом можно взять тут. Под катом пример использования компонента и небольшие пояснения к его устройству.

Об алгоритме расчета координат узлов дерева читайте в предыдущей статье Как построить дерево в виде графа.

Компонент расчитан на построение дерева, описанного объектом, реализующим интерфейс TreeModel. Это интерфейс из пакета javax.swing.tree использующийся в стандартном компоненте JTree. События TreeModelEvent предлагаемым компонентом не обрабатываются, что, безусловно, не хорошо и возможно будет исправлено. Перерасчет разметки дерева происходит при вызове метода setModel у JGraphTree.

JGraphTree генерирует события взаимодействия мыши с узлами дерева: MouseEnteredEvent, MouseExitedEvent, MousePressedEvent, MouseReleasedEvent и MouseClickedEvent. Каждое событие сопровождается объектом MouseClickedEvent, возвращающим ссылку на узел, с которым связано событие и ссылку на стандартный объект MouseEvent.

Отрисовка узлов дерева вынесена в отдельный компонент, реализующий интерфейс NodeRender:

public interface NodeRender {

    /**
     * Возвращает компонент, рисующий узел дерева.
     * 
     * @param node
     *            отображаемый узел дерева.
     * @param pressed
     *            true, если узел находится в нажатом состоянии.
     * @param highlighted
     *            true, если узел подсвечен.
     * @return компонент, рисующий узел дерева.
     */
    Component getNodeRendererComponent(Object node, boolean pressed, boolean highlighted);
}
Метод getNodeRendererComponent должен возвращать компонент, в виде которого рисуется узел node. При этом ключи pressed и highlighted указывают на то, был ли узел нажат и подсвечен соответственно.

Пример реализации NodeRender с помощью объекта JButton

Пример реализации NodeRender с помощью собственного алгоритма отрисовки узла

Пример использования

Код для генерирования модели дерева можно взять с сайта Oracle: How to Use Trees.

DemoWindow - окно на котором расположен компонент. labelComment - компонент для вывода текстовой информации. Тоже располагается на DemoWindow. Идея примера в том, чтобы при нажатии на узел дерева выводить информацию о содержимом этого узла в labelComment.
public class App implements Runnable {
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(getLookAndFeel());
        } catch (Exception e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new App());
    }

    private static String getLookAndFeel() {
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                return info.getClassName();
            }
        }
        return UIManager.getSystemLookAndFeelClassName();
    }

    public void run() {
        final DemoWindow window = new DemoWindow();        
        TreeModel model = createTreeModel();        
        window.graphTree.setModel(model);
        window.graphTree.setNodeRender(new ButtonRender());
        window.graphTree.addMouseNodeEventListener(new MouseNodeAdapter() {
            @Override
            public void mouseClicked(MouseNodeEvent event) {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) event.getNode();
                String text = null;
                if (node.getUserObject() instanceof BookInfo) {
                    BookInfo bi = (BookInfo) node.getUserObject();
                    text = bi.bookName + ": " + bi.bookURL;
                } else {
                    text = node.getUserObject().toString();
                }
                window.labelComment.setText(text);
            }
        });
        window.setVisible(true);
    }
}
Напоминаю, что архив с библиотекой, исходным кодом и документацие вы можете скачать здесь.

Для запуска демонстрационного примера, распакуйте архив и запустите myswing-1.0.jar:

java -jar myswing-1.0.jar

Репозиторий www.bitbucket.org/dok/myswing.

Комментариев нет: