gpt4 book ai didi

java - DefaultTreeCellRenderer 未按预期工作

转载 作者:行者123 更新时间:2023-12-01 14:20:17 25 4
gpt4 key购买 nike

我疯了,因为我不明白我做错了什么。我需要树的每个节点都有不同的图标,就好像它是正确的、不正确的或需要更新一样。我看到了 Oracle 文档和很多网页(包括 Stackoverflow),但我的代码仅显示具有相同图标的所有节点。如果我做错了什么,我很抱歉,这是我的第一篇帖子:>

显示:我无法展示,因为我没有声誉 >.<

想象一棵树,并想象它始终显示带有 gifNew 图标的 leafIcon。似乎只有状态才会监听最后一个节点。

这是代码(所有变量都已正确创建,图标如 gifNew 也是如此):

图标:

static Icon closedIcon = new ImageIcon("folder.png");
static Icon openIcon = new ImageIcon("folder.png");
static Icon leafIcon = new ImageIcon("file.png");
static Icon gifWarn = new ImageIcon("warn.gif");
static Icon gifOk = new ImageIcon("ok.gif");
static Icon gifNew = new ImageIcon("plus.gif");
static Icon gifError = new ImageIcon("error.gif");

通话:

tree.setCellRenderer(new TreeRenderer());

渲染器:

private static class TreeRenderer extends DefaultTreeCellRenderer {


public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) {

super.getTreeCellRendererComponent(tree, value, sel, exp, leaf, row, hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
String s = node.getUserObject().toString();
String error;
if (actualTree.equals("DOORS")){
error = checkTypeError(s, valuesClass.listOfValuesDOORS);
//System.out.println("DOORS - S: "+s);
}else{
error = checkTypeError(s, valuesClass.listOfValuesTC);
//System.out.println("TC - S: "+s);
}

switch (error) {
case "CORRECT":
setOpenIcon(openIcon);
setClosedIcon(closedIcon);
setLeafIcon(leafIcon);
break;
case "CREATE":
setOpenIcon(gifNew);
setClosedIcon(gifNew);
setLeafIcon(gifNew);
break;
case "DELETE":
setOpenIcon(gifError);
setClosedIcon(gifError);
setLeafIcon(gifError);
break;
case "UPDATE":
setOpenIcon(gifWarn);
setClosedIcon(gifWarn);
setLeafIcon(gifWarn);
break;
default:
setOpenIcon(openIcon);
setClosedIcon(closedIcon);
setLeafIcon(leafIcon);
//System.err.println("ERROR IN RENDERER. VALUE: "+error);
break;
}

return this;
}

/*****************************************
* Function that return which error have the actual node to push the icon when the tree is created.
*****************************************/
protected static String checkTypeError(String txt, List<valuesClass> list){

for (int i = 0; i < list.size(); i++) {
if (list.get(i).text.equals(txt))
if (list.get(i).create == true){
return "CREATE";
}else if (list.get(i).delete == true){
return "DELETE";
}else if (list.get(i).update == true){
return "UPDATE";
}else{

return "CORRECT";
}
}
return "DEFAULT";
}
}

最佳答案

您所描述的行为是由于您没有在 switch 语句中正确设置节点图标而引起的。 setOpenIcon()setClosedIcon() 等设置渲染器将用于整个树的图标。因此,最后一个节点中采取的操作将决定最终渲染哪些图标。

DefaultTreeCellRenderer 扩展了 JLabel。该组件将用于每个节点来呈现其内容。需要设置的是该组件的图标,即您的代码应如下所示:

switch (error) {
case "CORRECT":
setIcon(leafIcon); // sets the icon of the renderer which is a JLabel
break;
case "CREATE":
setIcon(gifNew);
break;
case "DELETE":
setIcon(gifError);
break;
...
}

请务必在所有情况下设置图标,并确保您了解渲染器如何用于渲染树节点(所有节点重复使用同一实例)

关于java - DefaultTreeCellRenderer 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17651237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com