我用defaultTreeCellRender来渲染jtree的node显示,jtree的model里存的是ID,需要渲染为它的中文名(中文名和id是对应的,保存在缓存中),但是中文名可以变化. 当jtree显示在jpanel上面,同时在缓存中改变此node的中文名使其长度增加,jtree上就会显示不完全,后面的显示为"....",请问怎么样才能让node显示的中文名实时刷新?多谢多谢
调试欢乐多
通过setPreferredSize(new Dimension(x,y))来避免上面情况的出现。 tree.setCellRenderer(new DefaultTreeCellRenderer() {
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value,
sel, expanded, leaf, row, hasFocus);
int length = getLength(value);
this.setPreferredSize(new Dimension(length,this.getHeight()));//这只是简单的实现
return this;
}
//计算显示字符的长度
public int getLength(Object value){
......
return length;
}
});Best Regards!
请构造自己的TreeNode(id,name),在name修改的时候通知Model刷新就好了,绘制就交给Renderer。实在不行,把代码拿上来看看!
displayChineseString()这个方法是动态显示的,显示的内容是缓存中的内容(缓存中保存这一个map,key是treeNode,value是跟treeNode对应的中文名,在key不变的情况下,value可以被其他模块任意修改)我可以监听缓存修改的消息来主动刷新jtree,但是这样有点麻烦,
如果用render显示,是不是只能主动刷新jtree来达到显示中文名的同步??
多谢gongfuliang的热心解答!
import java.awt.Component;
import java.awt.Dimension;import javax.swing.JFrame;
import javax.swing.JLabel;import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellRenderer;public class TreeCellRendererTest {
JTextField lab = new JTextField("1111"); DefaultMutableTreeNode root, client; public TreeCellRendererTest() {
// 树
root = new DefaultMutableTreeNode("资源管理器");
client = new DefaultMutableTreeNode("111");
root.add(client);
JTree tree = new JTree(root);
tree.setCellRenderer(new TestRenderer());
JScrollPane sp = new JScrollPane(tree);
JFrame f = new JFrame();
f.getContentPane().add(sp, BorderLayout.CENTER);
f.getContentPane().add(lab, BorderLayout.SOUTH);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(800, 300);
f.setLocationRelativeTo(null);
f.show();
// TODO Auto-generated constructor stub
} public static void main(String[] args) {
new TreeCellRendererTest();
} public String getTextString() {
return lab.getText();
} private class TestRenderer extends DefaultTreeCellRenderer implements
TreeCellRenderer { Dimension dim = new Dimension(); JLabel l = new JLabel(); public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
JLabel label=new JLabel();
String s=lab.getText();
label.setText(s);
return label;
}
}
}