|
|
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
Хочу сделать динамическое дерево,т.е. чтобы при нажатии на лист или узел появлялось меню, в котором я могу выбрать "создать подгруппу","создать группу" ну и т.д. Также необходимо,чтобы сразу это все заносилось в базу.Вопрос, как организовать таблички в таком случае. Узел1, у него подУзел1.1, а у подУзла1.1 есть подУзел3, как в базе это все хранить,ведь иерархия может быть очень большой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 13:52 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
А что Грассофт скажет по этому поводу, он у нас много накодил в свое время по JTree ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 14:15 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
peter6636Хочу сделать динамическое дерево,т.е. чтобы при нажатии на лист или узел появлялось меню, в котором я могу выбрать "создать подгруппу","создать группу" ну и т.д. Также необходимо,чтобы сразу это все заносилось в базу.Вопрос, как организовать таблички в таком случае. Узел1, у него подУзел1.1, а у подУзла1.1 есть подУзел3, как в базе это все хранить,ведь иерархия может быть очень большой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. У каждого узла есть уникальный идентификатор. И каждому узлу известен его родитель. Они в базе и хранятся. Правда чтобы пробещаться по пути, придется тебе делать рекурсивные хранимые процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 14:16 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
Я хотел сказать, что каждому узлу НУЖНО присвоить UID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 14:18 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
Кувалдин Роман peter6636Хочу сделать динамическое дерево,т.е. чтобы при нажатии на лист или узел появлялось меню, в котором я могу выбрать "создать подгруппу","создать группу" ну и т.д. Также необходимо,чтобы сразу это все заносилось в базу.Вопрос, как организовать таблички в таком случае. Узел1, у него подУзел1.1, а у подУзла1.1 есть подУзел3, как в базе это все хранить,ведь иерархия может быть очень большой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. У каждого узла есть уникальный идентификатор. И каждому узлу известен его родитель. Они в базе и хранятся. Правда чтобы пробещаться по пути, придется тебе делать рекурсивные хранимые процедуры. вот этого то я делать и не умею, что за процедуры такие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 14:19 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
Обычные. Они же stored procedures. Некоторые базы данных позволяют описать внутри себя необходимую логику. Эффективно в том случае, если тебе нужно получить какую-нибудь нетривиальную выборку из таблиц большого объема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 14:23 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
рекурсия это зло :)) если база на оракле, то там есть уже готовые функции работы с деревом :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 15:25 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
Linerрекурсия это зло :)) если база на оракле, то там есть уже готовые функции работы с деревом :)) у меня sql server 7.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 15:27 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
авторрекурсия это зло :))Почему? авторесли база на оракле, то там есть уже готовые функции работы с деревом :))А они не используют рекурсию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 16:54 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
а разве не подойдет для этого отношение с такими атрибутами: ПРЕДОК |ПОТОМОК UID предка UID потомка можно ли так описать предложенную структуру? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 17:01 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
KPIISа разве не подойдет для этого отношение с такими атрибутами: ПРЕДОК |ПОТОМОК UID предка UID потомка можно ли так описать предложенную структуру? То же что и я предлагал, только вынесенное в отдельную таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 17:17 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
Ну вот будет у меня сто групп и сто подгрупп, это ж сколько таблиц будет у меня в базе, о какой нормализации тогда будет ити речь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 19:24 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
GMaxПочему?Зачем ее использовать если можно попробовать обойтись без нее? :) ИМХО!!! Рекурсивный вызов хранимых процедур на сервере баз данных это круто ) GMaxА они не используют рекурсию? Честно? - не знаю :) 2peter6636 Дерево делаю так: В базе 1 табличка со структурой: id, id_parent, + необходимые поля потом запросик, но это для оракла Код: plaintext 1. 2. 3. 4. в sql server 7, нет функций работы с деревом, можешь попробовать сам формировать и хранить поле LEVEL - глубину вложенности текущего узла. Можешь еще попробовать динамически подгружать дерево из базы, когда пользователь раскрывает какой-нить узел - там вообще все просто, один селект с id_parent узла, который ткнул пользователь, это хорошо например, когда дерево большое а навигация по нему маленькая. Смысл грузить все дерево тогда (в несколько сотен элементов например), если пользователь ткнет 3-4 узла и успокоится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 06:37 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
Насколько я представляю себе, для создания дерева и его сохранения в базе достаточно одной таблицы. Есть несколько вариантов как это оганизовать. Например, можно хранить в базе 1. id узла 2. id родителя 3. уровень вложения Из этих трёх атрибутов можно получть исчерпывающую информацию о построении дерева. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 07:14 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
shiko_1 3. уровень вложения зачем? допустим, есть продукты типа компакт-дисков. они объединяются в группы. компакт-диск: - может не входить ни в одну из групп - может входить в одну группу - может входить в несколько групп для такой схемы нужно три таблицы: compact_disc (PK = primary key) field_namefield_typeidint (PK)namevarchar cd_group (если parent_id = null, то группа является корневой) field_namefield_typeidint (PK)parent_idint (null)namevarchar cd_group_rels (PK на оба поля) field_namefield_typegroup_idintcd_idint при старте программы и показе дерева совсем не обязательно читать все группы в дерево сразу. читаются только с parent_id = null. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. я писал тут: http://www.sql.ru/forum/actualthread.aspx?tid=195134#1651201 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 09:25 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
Ок, а для чего добавлять фиктивный элемент, чтобы узел отображался именно как узел,а не лист, или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 09:51 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
peter6636Ок, а для чего добавлять фиктивный элемент, чтобы узел отображался именно как узел,а не лист, или как?да, чтобы рядом с узлом "плюсик" был для раскрытия узла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 09:52 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
А.Грасоff™ peter6636Ок, а для чего добавлять фиктивный элемент, чтобы узел отображался именно как узел,а не лист, или как?да, чтобы рядом с узлом "плюсик" был для раскрытия узла. Ясно,спасибо,если что я еще спрошу кое-что ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 09:59 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
Еще вопрос, как мне отследить раскрыт узел или нет, нужно для того чтобы если раскрыт удалять фиктивный нод, если закрыт, добавить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 10:15 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
А.Грасоff™зачем? Если хочешь сразу все дерево заполнить и с рекурсией не заморачиваться, это поле поможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 10:17 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
1) Еще вопрос, как мне отследить раскрыт узел или нет, нужно для того чтобы если раскрыт удалять фиктивный нод, если закрыт, добавить 2) А что делать, если пользователь хахочет добавить новую группу.В таком случае нужно будет автоматически создавать таблицу в базе с определенным именем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 10:30 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток! Подскажите пож-ста, на данный момент я наполняю JTree из таблицы следующим кодом: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. где i - это уровень, то есть для формирования моего дерева мне необходимы следующее расположение данных: Столбец сортировки;Название;Уровень 1 А 0 2 б 1 3 В 0 4 г 1 То есть "А" и "В" - это корневые каталоги, а "б" и "г " - это подкаталоги "б"->"А", "г"->"В". В моем подходе существует как минимум несколько для меня минусов: 1. Не понимаю, как в режиме реального времени добавлять потомка к конкретному узлу 2. Невозможность соотнести потомка и корень, если они следуют не попорядку. Теперь сам вопрос: Как перестроить код наполнения дерева, чтоб получить вид: Уникальный идентификатор; Название; Уникальный идентификатор родителя 1 А 0 2 б 1 3 В 0 4 г 3 5 д 3 То есть здесь "А" и "В" - корневые каталоги, "б" потомок "А", "г" и "д" потомки "В". Заранее спасибо хоть за каккую нить подсказку! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 23:42 |
|
||
|
JTree и все что с ним связано
|
|||
|---|---|---|---|
|
#18+
И так для создания динамически формируемого и редактируемого дерева, нам понадобится: 1. Таблица со следующими данными: Create Table MyTable..TreeTable ( id int identity not null, //Уникальный идентификатор строки nameEvent varchar(1000) not null, //Отображаемое название parent int null, //Уникальный идентификатор родителя fullname varchar(4000) not null, //Полный путь дерева к элементу lvl int not null //Уровень элемента ) 2. Вносим наш корневой каталог (Это тот каталог, который будет виден вседа) INSERT INTO MyTable..TreeTable(nameEvent,fullname,lvl) values('Ваше название','Ваше название',0); 3. Затем идет раяд классов и методов для работы с получаемыми данными: new SetVisibleJTree().show(forma.jTreeEvents); //Основной запуск построения дерева /* *Добавляет лист в выбранный каталог */ package OnlyTree; import PublicClass.CONNECT; import PublicClass.MyException; import java.sql.SQLException; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; /** * * @author ezhov_da */ public class AddRoot { private JTree jTree; private JTextField jTextField; public AddRoot(JTree jtree,JTextField jtextfield){ jTree = jtree; jTextField=jtextfield; } public void AddRoot() throws MyException, SQLException{ try{ //********************************************************************** //Получаем выделенный узел TreeSelectionModel TSM = jTree.getSelectionModel(); TreePath TP = TSM.getSelectionPath(); DefaultMutableTreeNode TC = (DefaultMutableTreeNode)TP.getLastPathComponent(); TreeClass TCC = (TreeClass)TC.getUserObject(); //********************************************************************** //Здесь получим полный путь к событию String fullPath; fullPath=""; for(TreeNode path : TC.getPath()){ fullPath = fullPath +"*"+ path.toString(); //Разделители могут быть свои } //А здесь мы обрежем первый символ, так как он решетка fullPath = ((String)fullPath+"*"+jTextField.getText()).substring(1 , ((String)fullPath+"*"+jTextField.getText()).length()); //********************************************************************** //********************************************************************** //Вносим данные new CONNECT().insert( "INSERT INTO MyTable..TreeTable(nameEvent,parent,fullname,lvl) values('"+ jTextField.getText()+"'" + ","+TCC.getId()+",'" +fullPath+"'," +(TCC.getLvl()+1)+")" ); //Пересобираем таблицу new SetVisibleJTree().show(jTree); } catch(NullPointerException ex){throw new MyException("Выберите основной узел!");} //Мое исключение } } /* *Строим дерево, обратите внимание, что в моем примере дерево допускает 11 уровней вложенности, *Вы можете установить их количество по своему вкусу. */ package OnlyTree; import java.util.Enumeration; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.Vector; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeNode; /** * * @author ezhov_da */ public class CreateJTree extends DefaultMutableTreeNode { public DefaultTreeModel model(LinkedHashSet<TreeClass> maIntoMass,String nameRootEvent){ DefaultMutableTreeNode osnova; osnova = null; DefaultMutableTreeNode ср0; ср0 = null; DefaultMutableTreeNode ср1; ср1=null; DefaultMutableTreeNode ср2; ср2=null; DefaultMutableTreeNode ср3; ср3=null; DefaultMutableTreeNode ср4; ср4=null; DefaultMutableTreeNode ср5; ср5=null; DefaultMutableTreeNode ср6; ср6=null; DefaultMutableTreeNode ср7; ср7=null; DefaultMutableTreeNode ср8; ср8=null; DefaultMutableTreeNode ср9; ср9=null; DefaultMutableTreeNode ср10; ср10=null; DefaultMutableTreeNode ср11; ср11=null; for(TreeClass me : maIntoMass){ switch(me.getLvl()){ case 0: ср0 = new DefaultMutableTreeNode(me); break; case 1: ср1 = new DefaultMutableTreeNode(me); ср0.add(ср1); break; case 2: ср2 = new DefaultMutableTreeNode(me); ср1.add(ср2); break; case 3: ср3 = new DefaultMutableTreeNode(me); ср2.add(ср3); break; case 4: ср4 = new DefaultMutableTreeNode(me); ср3.add(ср4); break; case 5: ср5 = new DefaultMutableTreeNode(me); ср4.add(ср5); case 6: break; case 7: ср6 = new DefaultMutableTreeNode(me); ср5.add(ср6); break; case 8: ср7 = new DefaultMutableTreeNode(me); ср6.add(ср7); break; case 9: ср8 = new DefaultMutableTreeNode(me); ср7.add(ср8); break; case 10: ср9 = new DefaultMutableTreeNode(me); ср8.add(ср9); break; case 11: ср10 = new DefaultMutableTreeNode(me); ср9.add(ср10); break; } } return new javax.swing.tree.DefaultTreeModel(ср0); } } /* *Удаляем не нужные узлы */ package OnlyTree; import PublicClass.CONNECT; import PublicClass.MyException; import java.sql.SQLException; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; /** * * @author ezhov_da */ public class DeleteRoot { private JTree jTree; public DeleteRoot(JTree jtree){ jTree = jtree; } public void deleteRoot() throws MyException, SQLException{ TreeSelectionModel TSM = jTree.getSelectionModel(); TreePath TP = TSM.getSelectionPath(); DefaultMutableTreeNode TC = (DefaultMutableTreeNode)TP.getLastPathComponent(); TreeClass TCC = (TreeClass)TC.getUserObject(); if (TC.getChildCount()>0) throw new MyException("Вы пытаетесь удалить узел, у которого есть потомок!"); new CONNECT().delete("Delete From MyTable..TreeTable Where id = "+TCC.getId()); new SetVisibleJTree().show(jTree); } } /* *Отображаем дерево из нашего запроса */ package OnlyTree; import PublicClass.CONNECT; import java.sql.SQLException; import javax.swing.JTree; /** * * @author ezhov_da */ public class SetVisibleJTree { public void show(JTree jTree) { try{ jTree.setModel( new CreateJTree().model( new CONNECT().selectCreateTree("SELECT id, [nameEvent],parent,fullname," + " [lvl] FROM [MyTable].[dbo].[TreeTable]" + " order by fullname,[lvl],id"), "Событие")); } catch(SQLException e){System.out.println("Ошибка при построении дерева на стадии отображения!");} } } /* *Класс, который хранит информацию о нашем элементе в дереве */ package OnlyTree; /** * * @author ezhov_da */ public class TreeClass { private int id; private String name; private int parent; private String fullname; private int lvl; public TreeClass(int id, String name,int parent, String fullname,int lvl){ this.id = id; this.name = name; this.lvl=lvl; this.parent = parent; this.fullname=fullname; } public String getName(){ return name; } public int getLvl(){ return lvl; } public int getId(){ return id; } public String toString(){ return name; } public String detFullname(){ return fullname; } public int getParent(){ return parent; } } /* *Мое собственное исключение, которое я вывожу в *случае нужной мне ошибки(такой как к примеру удаление узла с потомками) */ package PublicClass; import javax.swing.JOptionPane; /** * * @author ezhov_da */ public class MyException extends Exception { private String alarm; public MyException(String str){ alarm = str; } public void alarm(){ JOptionPane.showMessageDialog(null, alarm, "Важно!", JOptionPane.ERROR_MESSAGE); } } /* *Методы для получения информации */ public LinkedHashSet<TreeClass> selectCreateTree(String zapros) throws SQLException{ LinkedHashSet<TreeClass> mass = new LinkedHashSet<TreeClass>(); Statement st = myConnection.createStatement(); //Запрос хранится в объекте, реализующем интерфейс Statement ResultSet result = st.executeQuery(zapros); //Выполняем запрос ResultSetMetaData rmd = result.getMetaData(); while(result.next()){ mass.add(new TreeClass( result.getInt(1) ,result.getString(2) ,result.getInt(3) ,result.getString(4) ,result.getInt(5) )); } result.close(); return mass; } public void delete(String zapros) throws SQLException{ Statement st = myConnection.createStatement(); //Запрос хранится в объекте, реализующем интерфейс Statement st.execute(zapros); //Выполняем запрос } public void insert(String zapros) throws SQLException{ Statement st = myConnection.createStatement(); //Запрос хранится в объекте, реализующем интерфейс Statement st.execute(zapros); //Выполняем запрос } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 12:19 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=178&tid=2127331]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
11ms |
get forum data: |
1ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 373ms |

| 0 / 0 |
