Компонент 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);
}
Пример реализации NodeRender с помощью объекта JButton
Пример реализации NodeRender с помощью собственного алгоритма отрисовки узла
Пример использования
Код для генерирования модели дерева можно взять с сайта Oracle: How to Use Trees.
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.
Комментариев нет:
Отправить комментарий