Из прочтения того, как работают Tree
и TreeItem
, похоже, что наилучшим вариантом является создание подкласса TreeItem
и переопределение setState(boolean, boolean)
для раннего возврата, если выполняется какое-либо условие
public class CustomTreeItem extends TreeItem {
@Override
public void setState(boolean open, boolean fireEvents) {
//check if we want to allow the item to close
if (!open && !mayClose()) {
return;
}
super.setState(boolean open, boolean fireEvents);
}
/**
* Returns true if the item may be closed, due to some specific rules
*/
public boolean mayClose() {
// your check goes here
}
}
Недостатком этого является то, что вам нужно будет создать один из ваших собственных экземпляров, где бы вы ни хотели, чтобы эта логика работала. Один из способов сделать это проще - переопределить различные методы addItem(...)
и addTextItem(...)
, чтобы всегда создавать экземпляры этого подкласса.
CloseEvent
запускается (если смотреть на GWT 2.4.0, в старых версиях это может отличаться) из метода Tree.fireStateChanged(TreeItem, boolean
. Это защищенный пакет, поэтому недоступный, а не метод, который не требует значительных усилий при смене домена.
Tree.fireStateChanged
вызывается из TreeItem.setState, метода, переопределенного выше. Этот метод кажется ответственным не только за проверку, имеет ли смысл открывать, но также за предотвращение перерисовки, если не нужно, и за выполнение реальной перерисовки. Он призывает Древо, чтобы попросить его запустить события. Изменение этого кода гарантирует, что даже в тех случаях, когда события не запускаются (их нет в коде GWT, они могут быть), они все равно будут выполнять вашу логику.
TreeItem.setState(boolean,boolean)
вызывается из двух мест в GWT, одно из TreeItem.setState(boolean)
, для удобства, и один раз, когда пользователь щелкает элемент (см. Tree.elementClicked(Element)
). Другое переопределение TreeItem.setState(boolean)
вызывается из трех мест, связанных с навигацией с помощью клавиатуры. Исходя из этого, мы можем быть уверены, что это основные методы, связанные с изменением состояния развертывания / свертывания дерева, и мы можем быть уверены, что его изменение правильно повлияет на поведение дерева.