动态更改 JTree 的节点图像
我正在使用 CustomCellRenderer 来显示 JTree 的节点,以将节点显示为图像 如下所示:-
class CustomTreeCellRenderer extends DefaultTreeCellRenderer{
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus){
super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
JLabel label = (JLabel) this ;
label.setIcon( new ImageIcon("white.png") ) ;
return this;
}
}
我的要求是在某些外部操作上更改节点的图像。 我正在尝试重新加载 JTree 模型,但它不起作用,如下所示:-
public void actionPerformed(ActionEvent ae) {
DefaultTreeModel model = (DefaultTreeModel) tree.getModel() ;
JLabel label = (JLabel) tree.getCellRenderer() ;
System.out.println(label.getIcon()); //displaying white.png
label.setIcon( new ImageIcon("black.gif") ) ;
model.reload() ;
}
我哪里做错了??????
I am using a CustomCellRenderer to display nodes of a JTree to display image with a node as
shown below :-
class CustomTreeCellRenderer extends DefaultTreeCellRenderer{
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus){
super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
JLabel label = (JLabel) this ;
label.setIcon( new ImageIcon("white.png") ) ;
return this;
}
}
My requirement is to change image of the node on some external action.
I am trying to reload the model of JTree, but it's not working as shown below :-
public void actionPerformed(ActionEvent ae) {
DefaultTreeModel model = (DefaultTreeModel) tree.getModel() ;
JLabel label = (JLabel) tree.getCellRenderer() ;
System.out.println(label.getIcon()); //displaying white.png
label.setIcon( new ImageIcon("black.gif") ) ;
model.reload() ;
}
Where I am doing wrong??????
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
有几点:
actionPerformed
这样的方法从表中获取渲染器并修改它并不常见。 您也会影响列中使用该渲染器的所有单元格actionPerformed
期间在渲染器实例上设置了Icon
, ,始终通过 getTreeCellRendererComponent 方法访问渲染器进行绘制,并且您始终将图标设置为“white.png”,因此您永远不会显示“black.gif”。您可以选择在
actionPerformed
方法中设置模型的状态,然后从getTreeCellRendererComponent
中查询模型以获取要显示的图标。例如:
在渲染器中:
a couple points:
actionPerformed
and modifying it is not common practice. You should note that the renderer is shared, so you will be affecting all cells in the column that use that rendererIcon
on your renderer instance duringactionPerformed
, the renderer is always accessed for painting via thegetTreeCellRendererComponent
method, and in that you are always setting the icon to "white.png", so you will never get the "black.gif" to display.An option you have is to set state on the Model in your
actionPerformed
method, and then from within thegetTreeCellRendererComponent
you can query your model for the icon to be displayed.for example:
in the renderer:
将图标作为字段添加到渲染器类中。
更改此字段的值并重新绘制 JTree。
编辑:解释
在您的情况下,更改模型是没有用的。用于显示每个节点的图标是渲染器的一部分。
JTree 的渲染器对象不强制为
JComponent
。它必须是一个在代码调用getTreeCellRendererComponent
时提供JComponent
的对象。在您的情况下,将 getCellRenderer() 转换为 JLabel 纯粹是运气,因为
DefaultTreeCellRenderer
的默认实现是JLabel
的扩展。事实上,当您的渲染器确实调用了 setIcon 本身时,您的 getIcon 方法通常会为您提供放入渲染器中的最后一个图标。
完整代码工作:
Add your Icon to your renderer class as a field.
Change the value of this field and repaint the JTree.
Edit: explanations
In your case, it is useless to change the model. The icon used to display each of the nodes is a part of the renderer.
The renderer object of the JTree is not forced to be a
JComponent
. It has to be an object providing aJComponent
when the code callsgetTreeCellRendererComponent
.In your case, the cast of getCellRenderer() into a JLabel is just plain luck, because the default implementation of the
DefaultTreeCellRenderer
is an extension ofJLabel
.And, in fact, as your renderer did call setIcon on itself, it's normal that your getIcon methods gives you the last icon you did put into the renderer.
Full code working :