Это утверждение является избыточным и ненужным:
"При нажатии на treemItem, все остальные treeItem и виджеты на
не следует выбирать одну и ту же и другую панель. "
Конечно, когда вы нажимаете на узел дерева, это единственный узел, который вы хотите активировать. Ни один другой узел не будет иметь никакой активности. Это условно.
И я действительно не знаю, о чем это утверждение:
"Как будто идет обработка, так что никакие другие вещи не могут
сделать ".
Ваш вопрос должен быть просто:
Как добавить дочерние узлы в виджет дерева, куда добавляются дочерние узлы
только когда я нажимаю на узел? Когда я нажимаю на узел, если он не имеет
дочерние узлы, RPC будет запущен для извлечения узлов. Как должен
мои результаты RPC обновить узел? После того, как я нажму на узел, он должен быть
подсвечен. На всем дереве должен быть только один выделенный / выделенный узел.
Расширьте горизонтальную панель, чтобы она содержала значок и заголовок.
Это должно реализовать IsTreeItem.
Он должен реализовывать ClickHandler, чтобы его можно было добавлять в качестве обработчиков кликов к значку и метке заголовка.
public class Node
extends HorizontalPanel
implements ClickHandler, IsTreeItem{
Image img;
Label label;
MyData data;
TreeItem nodeWrapper;
Конструктор питается в записи MyData, создает экземпляр изображения значка и метки заголовка и ассоциирует себя как обработчик нажатия для значка и метки:
public Node(MyData data){
this.nodeWrapper = new TreeItem(this);
this.img = new Image(data.getIconUrl());
this.label = new Label(data.getTitle());
this.data = data;
this.add(img);
this.add(this.label);
// ensure onclick is triggered either by clicking img or label.
this.img.addClickHandler(this);
this.label.addClickHandler(this);
}
Реализация IsTreeItem требует, чтобы узел был в состоянии обосновать себя с помощью TreeItem:
public TreeItem asTreeItem(){
return this.nodeWrapper;
}
Обработка кликов извлечет список дочерних записей, итеративно создаст новые узлы из дочерних записей и присоединит их к текущему узлу. Здесь происходит действие обратного вызова RPC.
public void onClick(ClickEvent e){
this.displayRightPanel(this.data);
if(this.nodeWrapper.getChildCount()==0)
fetchNodeData(
this.nodeWrapper,
this.data.getId(),
new AsyncCallBack<List<MyData>>(){
public void onSuccess(List<MyData> nodeDataList){
for(MyData nodeData : nodeDataList){
Node.this.nodeWrapper.addItem(new Node(nodeData));
}
}
public void onFailure(Throwable sorry){
doWhatever();
}
}
);
}
определить другие соответствующие методы перед закрытием определения класса:
//blah ... blah ... blah...
}
Поскольку это не учебник по RPC, вы должны узнать, как написать часть RPC. Вам нужно определить MyData, который является общим POJO между клиентом GWT и сервлетом RPC. RPC-сервлет должен возвращать список MyData. Чтобы понять, почему вам нужен метод getId (), вы должны быть знакомы хотя бы со 2-й нормальной формой нормализации базы данных.
public Interface MyData{
String getIconURL();
String getTitle();
String getId();
// among others ...
}
Предполагается, что у вас есть сплитпанель. Левая сторона - это виджет дерева, а правая панель - своего рода дисплей. Так что onclick, помимо запуска RPC-выборки, также вызовет displayRightPanel (data), и вам остается только указать, как вы хотите отобразить эти данные.
Вы должны создать первый корневой узел и связать его как корень дерева, а остальная часть дерева будет заполнена щелчком пользователя. Таким образом, корневой узел потребует от вас создания записи MyData, которая будет содержать iconUrl, заголовок и некоторые корневые данные.
Виджет дерева будет управлять выделением своих членов и обеспечит выделение только одного члена.