powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JTree и все что с ним связано
24 сообщений из 24, страница 1 из 1
JTree и все что с ним связано
    #33319998
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу сделать динамическое дерево,т.е. чтобы при нажатии на лист или узел появлялось меню, в котором я могу выбрать "создать подгруппу","создать группу" ну и т.д. Также необходимо,чтобы сразу это все заносилось в базу.Вопрос, как организовать таблички в таком случае.
Узел1, у него подУзел1.1, а у подУзла1.1 есть подУзел3,
как в базе это все хранить,ведь иерархия может быть очень большой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
1
1.1
1.1.1------1.1.1.1
               1.1.1.2-------1.1.1.2.1----
               ..........
               
1.2--------1.2.1
2
2.1
кто как делает такое
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33320093
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что Грассофт скажет по этому поводу, он у нас много накодил в свое время по JTree
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33320097
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
peter6636Хочу сделать динамическое дерево,т.е. чтобы при нажатии на лист или узел появлялось меню, в котором я могу выбрать "создать подгруппу","создать группу" ну и т.д. Также необходимо,чтобы сразу это все заносилось в базу.Вопрос, как организовать таблички в таком случае.
Узел1, у него подУзел1.1, а у подУзла1.1 есть подУзел3,
как в базе это все хранить,ведь иерархия может быть очень большой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
1
1.1
1.1.1------1.1.1.1
               1.1.1.2-------1.1.1.2.1----
               ..........
               
1.2--------1.2.1
2
2.1
кто как делает такое

У каждого узла есть уникальный идентификатор. И каждому узлу известен его родитель. Они в базе и хранятся.
Правда чтобы пробещаться по пути, придется тебе делать рекурсивные хранимые процедуры.
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33320105
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хотел сказать, что каждому узлу НУЖНО присвоить UID.
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33320107
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин Роман peter6636Хочу сделать динамическое дерево,т.е. чтобы при нажатии на лист или узел появлялось меню, в котором я могу выбрать "создать подгруппу","создать группу" ну и т.д. Также необходимо,чтобы сразу это все заносилось в базу.Вопрос, как организовать таблички в таком случае.
Узел1, у него подУзел1.1, а у подУзла1.1 есть подУзел3,
как в базе это все хранить,ведь иерархия может быть очень большой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
1
1.1
1.1.1------1.1.1.1
               1.1.1.2-------1.1.1.2.1----
               ..........
               
1.2--------1.2.1
2
2.1
кто как делает такое

У каждого узла есть уникальный идентификатор. И каждому узлу известен его родитель. Они в базе и хранятся.
Правда чтобы пробещаться по пути, придется тебе делать рекурсивные хранимые процедуры.
вот этого то я делать и не умею, что за процедуры такие
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33320128
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычные. Они же stored procedures. Некоторые базы данных позволяют описать внутри себя необходимую логику. Эффективно в том случае, если тебе нужно получить какую-нибудь нетривиальную выборку из таблиц большого объема.
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33320146
GMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33320364
Liner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рекурсия это зло :))
если база на оракле, то там есть уже готовые функции работы с деревом :))
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33320378
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Linerрекурсия это зло :))
если база на оракле, то там есть уже готовые функции работы с деревом :))
у меня sql server 7.0
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33320743
GMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторрекурсия это зло :))Почему?
авторесли база на оракле, то там есть уже готовые функции работы с деревом :))А они не используют рекурсию?
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33320764
KPIIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а разве не подойдет для этого отношение с такими атрибутами:
ПРЕДОК |ПОТОМОК
UID предка UID потомка

можно ли так описать предложенную структуру?
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33320814
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KPIISа разве не подойдет для этого отношение с такими атрибутами:
ПРЕДОК |ПОТОМОК
UID предка UID потомка

можно ли так описать предложенную структуру?

То же что и я предлагал, только вынесенное в отдельную таблицу.
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33321145
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот будет у меня сто групп и сто подгрупп, это ж сколько таблиц будет у меня в базе, о какой нормализации тогда будет ити речь?
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33321436
Liner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GMaxПочему?Зачем ее использовать если можно попробовать обойтись без нее? :)
ИМХО!!! Рекурсивный вызов хранимых процедур на сервере баз данных это круто )
GMaxА они не используют рекурсию? Честно? - не знаю :)

2peter6636
Дерево делаю так:
В базе 1 табличка со структурой: id, id_parent, + необходимые поля
потом запросик, но это для оракла
Код: plaintext
1.
2.
3.
4.
SELECT id, ..., LEVEL lv
FROM table
START WITH id_parent =  0 
CONNECT BY PRIOR id = id_parent
в поле lv получается глубина вложенности узла, и потом просто в цикле начиная с самого маленького lv заполняю дерево. т.е. вначале рутовые узлы, потом к ним их потомков, потом к ним их и т.д. до последнего уровня
в sql server 7, нет функций работы с деревом, можешь попробовать сам формировать и хранить поле LEVEL - глубину вложенности текущего узла.

Можешь еще попробовать динамически подгружать дерево из базы, когда пользователь раскрывает какой-нить узел - там вообще все просто, один селект с id_parent узла, который ткнул пользователь, это хорошо например, когда дерево большое а навигация по нему маленькая. Смысл грузить все дерево тогда (в несколько сотен элементов например), если пользователь ткнет 3-4 узла и успокоится?
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33321455
shiko_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я представляю себе, для создания дерева и его сохранения в базе достаточно одной таблицы. Есть несколько вариантов как это оганизовать.

Например, можно хранить в базе

1. id узла
2. id родителя
3. уровень вложения

Из этих трёх атрибутов можно получть исчерпывающую информацию о построении дерева.
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33321585
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
 class  CDGroup {
   int  id;
   int  parentId;
  String name;
}

List getGroups(CDGroup parentGroup) {
  ...
}

// на старте программы:
List groups = getGroups( null );
...
далее список отображаем в ноды дерева. как это сделать более эффективно
я писал тут: http://www.sql.ru/forum/actualthread.aspx?tid=195134#1651201
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33321648
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, а для чего добавлять фиктивный элемент, чтобы узел отображался именно как узел,а не лист, или как?
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33321652
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
peter6636Ок, а для чего добавлять фиктивный элемент, чтобы узел отображался именно как узел,а не лист, или как?да, чтобы рядом
с узлом "плюсик" был для раскрытия узла.
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33321676
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ peter6636Ок, а для чего добавлять фиктивный элемент, чтобы узел отображался именно как узел,а не лист, или как?да, чтобы рядом
с узлом "плюсик" был для раскрытия узла.
Ясно,спасибо,если что я еще спрошу кое-что
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33321735
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопрос, как мне отследить раскрыт узел или нет, нужно для того чтобы если раскрыт удалять фиктивный нод, если закрыт, добавить
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33321744
Liner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™зачем?
Если хочешь сразу все дерево заполнить и с рекурсией не заморачиваться, это поле поможет
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #33321785
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Еще вопрос, как мне отследить раскрыт узел или нет, нужно для того чтобы если раскрыт удалять фиктивный нод, если закрыт, добавить
2) А что делать, если пользователь хахочет добавить новую группу.В таком случае нужно будет автоматически создавать таблицу в базе с определенным именем?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
JTree и все что с ним связано
    #38615945
RRNDEONISIUSEZH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Подскажите пож-ста, на данный момент я наполняю 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.
class MyModelTree extends DefaultMutableTreeNode {
 
public DefaultTreeModel model(String[][] vot){
 
DefaultMutableTreeNode osnova;
osnova = null;
DefaultMutableTreeNode osnova1;
osnova1 = null;
DefaultMutableTreeNode ср1;
ср1=null;
DefaultMutableTreeNode ср2;
ср2=null;
DefaultMutableTreeNode ср3;
ср3=null;
DefaultMutableTreeNode ср4;
ср4=null;
DefaultMutableTreeNode ср5;
ср5=null;
                osnova =new DefaultMutableTreeNode("ГК");
 
for(int i = 0; i<vot.length;i++){
switch(Integer.parseInt(vot[i][2])){
                case 0:
                osnova1 = new DefaultMutableTreeNode(vot[i][1]);
                osnova.add(osnova1);
                break;
                case 1:
                ср1 = new DefaultMutableTreeNode(vot[i][1]);
                osnova.add(ср1);
                break;
                case 2:
                ср2 = new DefaultMutableTreeNode(vot[i][1]);
                ср1.add(ср2);
                break;
                case 3:
                ср3 = new DefaultMutableTreeNode(vot[i][1]);
                ср2.add(ср3);
                break;
                case 4:
                ср4 = new DefaultMutableTreeNode(vot[i][1]);
                ср3.add(ср4);
                break;
                case 5:
                ср5 = new DefaultMutableTreeNode(vot[i][1]);
                ср4.add(ср5);
                break;
}
 
}
return new javax.swing.tree.DefaultTreeModel(osnova);
}
}



где i - это уровень, то есть для формирования моего дерева мне необходимы следующее расположение данных:

Столбец сортировки;Название;Уровень
1 А 0
2 б 1
3 В 0
4 г 1

То есть "А" и "В" - это корневые каталоги, а "б" и "г " - это подкаталоги "б"->"А", "г"->"В".

В моем подходе существует как минимум несколько для меня минусов:
1. Не понимаю, как в режиме реального времени добавлять потомка к конкретному узлу
2. Невозможность соотнести потомка и корень, если они следуют не попорядку.


Теперь сам вопрос:
Как перестроить код наполнения дерева, чтоб получить вид:
Уникальный идентификатор; Название; Уникальный идентификатор родителя
1 А 0
2 б 1
3 В 0
4 г 3
5 д 3

То есть здесь "А" и "В" - корневые каталоги, "б" потомок "А", "г" и "д" потомки "В".


Заранее спасибо хоть за каккую нить подсказку!
...
Рейтинг: 0 / 0
JTree и все что с ним связано
    #38616318
RRNDEONISIUSEZH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И так для создания динамически формируемого и редактируемого дерева, нам понадобится:

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); //Выполняем запрос
}






...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JTree и все что с ним связано
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]