У меня есть rich:tree
компонент, используемый так:
<rich:tree switchType="client" value="#{MyBacking.logTree}"
reRender="selectedLog" var="item" nodeFace="#{item.type}"
nodeSelectListener="#{MyBacking.processLogSelection}"
style="width: 50px;">
<rich:treeNode type="folder"
icon="/img/logListFolderIconClosed.png"
iconLeaf="/img/logListFolderIconOpen.png">
<h:outputText value="#{item.name}" />
</rich:treeNode>
<rich:treeNode type="log" iconLeaf="/img/logFileIcon.png"
icon="/img/logFileIcon.png">
<h:outputText value="#{item.name}" />
</rich:treeNode>
</rich:tree>
и мой метод processBogSelection () в MyBacking:
public void processLogSelection(NodeSelectedEvent event) {
logger.info("In processLogSelection");
HtmlTree tree = (HtmlTree) event.getComponent();
nodeTitle = (String) tree.getRowData();
selectedNodeChildren.clear();
TreeNode currentNode = tree.getModelTreeNode(tree.getRowKey());
if (currentNode.isLeaf()){
selectedNodeChildren.add((String)currentNode.getData());
} else {
Iterator<Map.Entry<Object, TreeNode>> it = currentNode.getChildren();
while (it != null && it.hasNext()) {
Map.Entry<Object, TreeNode> entry = it.next();
selectedNodeChildren.add(entry.getValue().getData().toString());
logger.info("selected node: " + entry.getValue().getData().toString());
}
}
}
Но когда страница отображает дерево (точный), щелчок по узлу выделяет узел, но ничего не регистрируется ни одним из вызовов средства ведения журнала bean - метод просто не вызывается. Любая помощь, ответившая, почему это может быть, будет принята с благодарностью.
Mark
РЕДАКТИРОВАТЬ Добавлены предлагаемые теги / упрощенный метод bean-компонента - по-прежнему не получается получить ответ от bean-компонента в отношении журналов:
<h:panelGrid columns="2" border="0" width="100%" rowClasses="tt">
<rich:panel styleClass="panelLogTree" header="Log Select">
<h:form>
<rich:tree switchType="client" value="#{MyBacking.logTree}"
var="item" nodeFace="#{item.type}" reRender="selectedLog"
nodeSelectListener="#{MyBacking.processLogSelection}"
ajaxSubmitSelection="true" style="width: 50px;">
<rich:treeNode type="folder"
icon="/img/logListFolderIconClosed.png"
iconLeaf="/img/logListFolderIconOpen.png">
<h:outputText value="#{item.name}" />
</rich:treeNode>
<rich:treeNode type="log" iconLeaf="/img/logFileIcon.png"
icon="/img/logFileIcon.png">
<h:outputText value="#{item.name}" />
</rich:treeNode>
</rich:tree>
</h:form>
</rich:panel>
<rich:panel styleClass="panelLogOutput" header="Log Content">
<h:outputText escape="false"
value="Log content: #{MyBacking.nodeTitle}" id="selectedLog" />
</rich:panel>
</h:panelGrid>
</rich:tab>
Обратите внимание на конец rich:tab
, поскольку это дерево отображается на вкладке из включенного файла JSP. Мой метод поддержки бина также теперь:
public void processLogSelection(NodeSelectedEvent event) {
logger.info("In processLogSelection");
}
ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ
Интересно, что я решил вернуться к базовой рабочей модели. Я взял код со страницы демонстрации RichFaces . Я изменил face-config.xml, добавив бин SimpleTreeData
. У меня были проблемы с получением кода компонента, который читает файл данных в (simple-tree-data.properties
), поэтому вместо него я использовал FileReader
. Это нормально, и я получил измененную jsf-страницу index.jsp, чтобы перечислить простой пример дерева, как на демонстрационной странице, за исключением того, что нажатие на элемент списка не сообщило о выбранном nodeTitle
в указанное место (та же проблема).
Я могу видеть это либо как ту же проблему, о которой сообщалось выше, либо как факт изменения метода loadTree
в компоненте SimpleTreeData.java
. В этом изменении я удалил следующие строки и изменил посторонний код соответствующим образом:
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
InputStream dataStream = externalContext.getResourceAsStream(DATA_PATH);
Как упоминалось ранее, я использовал FileReader
, но кто-нибудь думает, что эта проблема может быть связана с удалением этих 3 строк? Как также указано выше, мой метод processLogSelection
не использует getCurrentInstance
, но я не уверен, что это необходимо, если в JSF указан ajaxSubmitSelection="true"
.
Тупик.