我有兴趣显示一个输入对话框,一旦用户在对话框中输入节点的名称,我想用他们输入的名称创建一个树节点。
我正在创建编辑对话框,然后在同一个函数中添加所有节点,但我看到的行为是树节点出现在对话框出现之前或用户甚至有机会提交节点的名称之前,这意味着显示对话框后包含的其余代码不会等待对话框返回输入。
有没有办法提供一个输入对话框并等待完成,然后再采取另一项行动?
这是我的代码 - add() 方法调用 editKey() 方法,然后添加节点。
我希望能够等待每个键的输入并在 add 函数中的其余代码继续之前构建标签名称,但情况似乎并非如此:
public void add(){
log.debug("node=<" + node.getValue() + ">");
Node saveNode = node;
if (node.getInfo().isList() ||
node.getInfo().isLeafList()){
try{
TreeHelper treeHelper = (TreeHelper)device.getTreeHelper();
Node n = treeHelper.getSchemaNode(node, node.getTagPath());
if (n != null){
if (node.getInfo().isList()){
log.debug("node<" + node.getName() + " is a list!");
String tagName = "";
if (n.getKeys().size() > 0){
for(String key: n.getKeys()){
node = n.getChildren().get(key);
if (node != null){
editKey(node);
}
if (tagName.equals("")){
tagName += node.getValue();
}else{
tagName += "-" + node.getValue();
}
}
}
n.setTag(tagName);
n.getInfo().setListEntry(true);
n.getNodeTypes().remove("List");
n.getNodeTypes().add("ListEntry");
node = saveNode;
}else if (node.getInfo().isLeafList()){
log.debug("node <" + node.getName() + "> is a leaf list!");
n.getInfo().setLeafListEntry(true);
n.getNodeTypes().remove("LeafList");
n.getNodeTypes().add("LeafListEntry");
}
addTreeNode(this.device,
selectedNode,
n,
true,
true);
}else{
log.debug("schema node is null for node <" + node.getName() + ">");
}
}catch(Exception e){
log.error(IO.stackTrace(e));
}
selectedNode.setExpanded(true);
}
RequestContext.getCurrentInstance().update("treeForm:treeSingle");
}
这是 editKey() 函数:
public void editKey(Node node) throws Exception{
FacesContext ctx = FacesContext.getCurrentInstance();
UIViewRoot rootView = ctx.getViewRoot();
Dialog dialog = (Dialog)rootView.findComponent("editDialog");
dialog.setVisible(true);
dialog.setModal(true);
dialog.getChildren().clear();
UIForm form = new UIForm();
form.getChildren().clear();
PanelGrid panel = new PanelGrid();
panel.setColumns(2);
OutputLabel label = new OutputLabel();
label.setValue(node.getName());
label.setFor("valueId");
panel.getChildren().add(label);
if (node.getDataTypes().contains("BOOL") ||
(node.getValue() != null &&
(node.getValue().equals("false") || node.getValue().equals("true")))){
SelectOneMenu menu = new SelectOneMenu();
ValueExpression valueExpression = createValueExpression("#{treeBean.node.value}");
menu.setValueExpression("value", valueExpression);
menu.setId("valueId");
menu.setLabel(node.getName());
if (node.getValue() != null &&
node.getValue().equals("false")){
UISelectItem item = new UISelectItem();
item.setItemLabel("false");
item.setItemValue("false");
menu.getChildren().add(item);
item = new UISelectItem();
item.setItemLabel("true");
item.setItemValue("true");
menu.getChildren().add(item);
}else{
UISelectItem item = new UISelectItem();
item.setItemLabel("true");
item.setItemValue("true");
menu.getChildren().add(item);
item = new UISelectItem();
item.setItemLabel("false");
item.setItemValue("false");
menu.getChildren().add(item);
}
panel.getChildren().add(menu);
}else if (node.getEnums().size() > 0){
SelectOneMenu menu = new SelectOneMenu();
ValueExpression valueExpression = createValueExpression("#{treeBean.node.value}");
menu.setValueExpression("value", valueExpression);
menu.setId("valueId");
menu.setLabel(node.getName());
for(String s : node.getEnums()){
int index = s.indexOf(":");
if (index != -1){
s = s.substring(0, index);
}
UISelectItem item = new UISelectItem();
item.setItemLabel(s);
item.setItemValue(s);
menu.getChildren().add(item);
}
panel.getChildren().add(menu);
}else{
InputText inputText = new InputText();
ValueExpression valueExpression = createValueExpression("#{treeBean.node.value}");
inputText.setValueExpression("value", valueExpression);
inputText.setId("valueId");
inputText.setLabel(node.getName());
inputText.setType("text");
panel.getChildren().add(inputText);
}
UIOutput output = new UIOutput();
output.setValue("Data types: ");
panel.getChildren().add(output);
output = new UIOutput();
output.setValue(node.getDataTypes().toString().replace("]", "").replace("[", ""));
panel.getChildren().add(output);
output = new UIOutput();
output.setValue("Min. occurs: ");
panel.getChildren().add(output);
output = new UIOutput();
output.setValue(node.getMinOccurs()+"");
panel.getChildren().add(output);
output = new UIOutput();
output.setValue("Max. occurs: ");
panel.getChildren().add(output);
output = new UIOutput();
output.setValue(node.getMaxOccurs()+"");
panel.getChildren().add(output);
form.getChildren().add(panel);
CommandButton button = new CommandButton();
button.setOnclick("$('#progress').show();$('#editDialog').hide();");
button.setOncomplete("$('#progress').hide();$('#editDialog').hide();");
button.setValue("submit");
MethodExpression me = createMethodExpression("#{treeBean.save}");
button.setActionExpression(me);
form.getChildren().add(button);
dialog.getChildren().add(form);
RequestContext.getCurrentInstance().update("editDialog");
RequestContext.getCurrentInstance().execute("editWidget.show()");
}