[英]Change JTree icons based on custom Object states
I have a JTree, based on several custom classes. 我有一个基于几个自定义类的JTree。 I want to give several Nodes a specific icon.
我想给几个节点一个特定的图标。 Therefore i did the following code based on this link: Dynamically change icon of specific nodes in JTree
因此,我基于此链接执行了以下代码: 动态更改JTree中特定节点的图标
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer() {
private static final long serialVersionUID = 1L;
private Icon good = new ImageIcon(getClass().getResource("/good.png"));
private Icon dunno = new ImageIcon(getClass().getResource("/dunno.png"));
private Icon bad = new ImageIcon(getClass().getResource("/bad.png"));
@Override
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean isLeaf, int row, boolean focused) {
Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused);
// JTreePanelNode node = (JTreePanelNode)c; - not possible
return c;
}
};
this.getTree().setCellRenderer(renderer);
Each of my Nodes is an object of JTreePanelNode (custom class), which saves a specific state which can be set via setState(String s) and get via getState(). 我的每个节点都是JTreePanelNode(自定义类)的对象,该对象保存可以通过setState(String s)设置并通过getState()获取的特定状态。 So what i want is to something like this:
所以我想要的是这样的事情:
if(node.getState().equals("good")) ..
else if(node.getState.equals("bad")) ..
else ..
How can i achieve something like that? 我怎样才能实现这样的目标? From what i understand the renderer goes through every node with getTreeCellRendererComponent and applies a specific icon which i can choose with setIcon and several ifs().
据我了解,渲染器使用getTreeCellRendererComponent遍历每个节点,并应用一个特定的图标,我可以使用setIcon和多个ifs()进行选择。 However i cannot cast to JTreePanelNode.
但是我无法转换为JTreePanelNode。 Any solution?
有什么办法吗? Thanks :)
谢谢 :)
All depends on your JTreePanelNode Class. 全部取决于您的JTreePanelNode类。 if it implements the TreeNode interface you are good to go with:
如果它实现了TreeNode接口,那么您可以选择:
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
Component comp = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,
row, hasFocus);
TreeNode current = (TreeNode)value;
if (leaf) {
//set leaf icon
} else if (expanded) {
//set expanded icon
} else {
// set default state
}
if (hasFocus)
//set what it looks like if focused
else if (selected)
//set what it looks like if selected
else
//set default l&f
comp.setIcon(whatevericonset in above conditions);
return comp;
}
Of course you can add many more states depending on your node class.getState(). 当然,您可以根据节点class.getState()添加更多状态。
you can get access to the Object represented in that tree: 您可以访问该树中表示的对象:
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean isLeaf, int row, boolean focused) {
Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused);
DefaultMutableTreeNode node = (DefaultMutableTreeNode ) value;
Object representedObject = node.getUserObject();
JLabel superLabel = super.getTreeCellRendererComponent();
String text = label.getText();
if(object.isGood() ){ //i don't know your code
superLabel .setText (text +"goooooooood");
}else{
superLabel .setText (text +"badbadbabd");
}
return superLabel ;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.