|
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 66
|
|
Tree средствами HTML26.03.2010, 11:21. Показов 1224. Ответов 9
Метки нет (Все метки)
Нужно реализовать Tree на Web странице. Уже придумал алгоритм, осталось только реализовать представление на JSP. Но вот незадача - не хотется этот код встаивать в страницу - некрасиво. Думал через custom tags, но не знаю как ссылку на JavaBean отображаемого дерева передать обработчику своего тега. А может есть стандартное решение? Подскажите плиз...
0
|
|
| 26.03.2010, 11:21 | |
|
Ответы с готовыми решениями:
9
Какими средствами написать конвертер DOC-HTML, HTML-DOC Определить предикат maxelem(Tree, Max), чтобы Max равнялось наибольшему из чисел, входящих в дерево Tree
|
|
mishgun
|
|
| 26.03.2010, 20:53 | |
|
<%@ include file='yourfile.html' %>
так не пойдет? |
|
|
mishgun
|
|
| 27.03.2010, 01:07 | |
|
Извиняюсь не совсем въехал в вопрос.
посмотрите на sourceforge.com там есть кастом таги на jacarta.apache.org jsptags.com тоже гляньте но по моему это лишний геморрой идите обычным путем |
|
|
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 66
|
|
| 28.03.2010, 09:49 [ТС] | |
|
Все, сделал. Обошелся без стандартных тегов - написал свой. Одно плохо - после каждого клика на узле дерева при сворачивании-разворачивании приходится перегружать страницу. Ещё пока не решил как восстанавливть текущую ветвь дерева на старой позиции при перегрузке страницы если раскрываемый или закрываемый узел находится не в начале документа. Если кому интересно - могу объяснить поподробнее, поделиться исходниками.
0
|
|
|
3 / 3 / 3
Регистрация: 09.07.2008
Сообщений: 422
|
|
| 28.03.2010, 12:02 | |
|
Держи hidden элемент для каждого узла
0
|
|
|
0 / 0 / 0
Регистрация: 26.05.2009
Сообщений: 81
|
|
| 28.03.2010, 14:03 | |
|
to makem
поделись исходничками если не трудно... на alekseymir@rambler.ru please
0
|
|
|
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 66
|
|
| 28.03.2010, 17:26 [ТС] | |
|
to SVOLOCH: че-то не догнал, зачем hidden? Чтоб привязаться к нему, что ли?
А исходнички подготовлю и опубликую здесь (не в обиду, да?). Думаю всем будет интересно . К завтрему наверное управлюсь.
0
|
|
|
3 / 3 / 3
Регистрация: 09.07.2008
Сообщений: 422
|
|
| 29.03.2010, 14:13 | |
|
Если реализовать дерево внутри тэга FORM, а клики на элементы дерева - как сабмит этой формы, причем для каждого узла держать hidden элемент, имеющий значение 'true' или 'false' в зависимости от текущего состояния узла, тогда при последующем построении дерева после сабмита ты всегда сможешь отобразить его так, как его развернул юзер. Могу исходничек скинуть, если что..
0
|
|
|
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 66
|
|
| 29.03.2010, 15:32 [ТС] | |
|
Спасибо, понял. Но я пошел несколько другим путем. Далее увидите, скоро сброшу исходники с краткими комментариями. Ждите, у меня много работы...
0
|
|
|
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 66
|
|
| 31.03.2010, 12:53 [ТС] | |
|
Выкладываю (все что знаю) Не осудите если где в чем то ошибся (но незначительно)
))))))))))))))))))).Во-первых, все узлы и линии дерева отображаются графикой 20x20 пикселов (для теста в формате bmp).Принята такая сигнатура: Для раскрытого узла minusR.bmp (R - всегда отображается связь с иконкой узла) minusRD.bmp (D - узел не последний на своем уровне) Для закрытого узла plusR.bmp plusRD.bmp Вертикальная линия без связей с узлами lineV.bmp Вертикальная линия с отображением связи с узлом у которого нет потомков lineRD.bmp Вертикальная линия с отображением связи с последним на своем уровне узлом у которого нет потомков lineR.bmp Графический табулятор ( заполнения пространства в глубину вложенности для строки) empty.bmp Далее привожу код custom taga public class TreeTag extends TagSupport implements javax.servlet.jsp.tagext.TryCatchFinally { private final String [] stages = {'circleRed.bmp', 'circleMagenta.bmp', 'circleBlue.bmp', 'circleGreen.bmp', 'circleBrown.bmp', 'circleBlack.bmp'}; // Кэш уровней связи (по коду станет ясно если так не понятно ))Vector vCash = new Vector(); // Атрибуты private String catalogName; private String headValue; public TreeTag() { super(); } public void otherDoStartTagOperations() { try { JspWriter out = pageContext.getOut(); ServletRequest sr = pageContext.getRequest(); out.println('<table bgcolor=#cccccc width='100%' border='0' cellspacing='1' cellpadding='0' align='left' class='ttext'>'); out.print('<tr bgcolor='#cccccc'><th align='center'>'); out.print('Схема'); out.print('</th><th width='90%' align='left'>'); out.print('Позиции'); out.print('</th></tr>'); out.print('<tr><td bgcolor=#ffffff>'); out.print('<img src='/Images/circleYellow.bmp' alt='' border=0 hspace=0 vspace=0>'); out.print('</td><td bgcolor=#ffffff>'); out.print(headValue); out.println('</td></tr>'); // Получить корневой каталог Vector vCatalog = (Vector)sr.getAttribute(catalogName); // прорисовка в глубину (рекурсия) printNodes(vCatalog,out); out.println('</table>'); out.flush(); } catch (Exception ex) { System.out.print(ex.toString()); } } public boolean theBodyShouldBeEvaluated() { return true; } public int doStartTag() throws JspException, JspException { otherDoStartTagOperations(); if (theBodyShouldBeEvaluated()) { return EVAL_BODY_INCLUDE; } else { return SKIP_BODY; } } public int doEndTag() throws JspException, JspException { otherDoEndTagOperations(); if (shouldEvaluateRestOfPageAfterEndTag()) { return EVAL_PAGE; } else { return SKIP_PAGE; } } // Геттеры sion> <jsp-version>1.2</jsp-version> <short-name>max</short-name> <uri>/max</uri> <display-name>max</display-name> <description>A blank tag library template. </description> <tag> <name>tree</name> <tag-class>tags.max.TreeTag</tag-class> <body-content>empty</body-content> <description></description> <tldx> <packagename>tags.max</packagename> <extendsSupportClass>TRUE</extendsSupportClass> <supportClass>TagSupport</supportClass> <implementsTryCatchFinally>TRUE</implementsTryCatchFinally> <findparent>FALSE</findparent> </tldx> <attribute> <name>catalog</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>String</type> <tldx> <javaVariable>catalogName</javaVariable> <IsReferenceID>FALSE</IsReferenceID> <ReferencesTag>FALSE</ReferencesTag> <ReferenceScope>Session</ReferenceScope> <ReferencesTagReferentFirst>TRUE</ReferencesTagReferentFirst> </tldx> </attribute> <attribute> <name>head</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>String</type> <tldx> <javaVariable>headValue</javaVariable> <defaultValue>'Заголовок'</defaultValue> <IsReferenceID>FALSE</IsReferenceID> <ReferencesTag>FALSE</ReferencesTag> <ReferenceScope>Session</ReferenceScope> <ReferencesTagType></ReferencesTagType> <ReferencesTagVariable></ReferencesTagVariable> <ReferencesTagReferentFirst>TRUE</ReferencesTagReferentFirst> </tldx> </attribute> <example></example> </tag> </taglib> Определение класса Node (узел дерева): package srv; import java.util.Vector; public class Node { // Состояние узла public static final int NODE_OPEN = 1; public static final int NODE_CLOSE = 2; // Cчетчик для идентификации каждого узла во время создания private static int nodesCount=1; // Имя узла private String nodeName; // Это для моих целей (для себя можете определить что угодно) private String nodeCode; // Ключ для поиска данного узла private String nodeKey; // Флаг наличия потомков boolean isMulty = false; // Текущее состояние int keyState = NODE_CLOSE; // Это тоже для своих целей int keyLevel; // Контейнер потомков Vector childs = new Vector(); public Node(String nodeCode, String nodeName, int iLevel) { this.nodeCode = nodeCode; this.nodeName = nodeName; this.keyLevel = iLevel; this.nodeKey = String.valueOf(nodesCount); nodesCount++; } public String getName() { return nodeName; } public boolean isKeyEquals(String key) { if(key.equals(nodeKey)) return true; return fa R> node32.setKey(Node.NODE_OPEN); node31.addChild(new Node('25','Test 3.1.1',2)); node31.addChild(new Node('26','Test 3.1.2',2)); node.addChild(node31); Node node321 = new Node('27','Test 3.2.1',2); Node node3211 = new Node('28','Test 3.2.1.1',3); node3211.addChild(new Node('29','Test 3.2.1.1.1',4)); node3211.addChild(new Node('30','Test 3.2.1.1.2',4)); node321.addChild(node3211); node321.addChild(new Node('31','Test 3.2.1.2',3)); node32.addChild(node321); node.addChild(node32); catalog.add(node); node = new Node('32','Test 4',0); node.addChild(new Node('33','Test 4.1',1)); catalog.add(node); node = new Node('34','Test 5',0); node.addChild(new Node('35','Test 5.1',1)); catalog.add(node); query.getRequest().setAttribute('testCat alog', catalog); Вот пока и все. Как говорится если нет подходящего решения - используй рекурсию - в скольких случаях это выручало! Будут вопросы - пишите. Хотя мгновенного ответа не гарантирую - работы невпроворот.Пока
0
|
|
| 31.03.2010, 12:53 | |
|
Помогаю со студенческими работами здесь
10
Как создать Tree - НЕ ОБЫЧНЫЙ, А как в XSI Render Tree или Maya HTML-code средствами Qt Изменение html средствами js Парсинг HTML средствами AS 3.0 Определить браузер средствами HTML Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|