请大家帮忙一个关于jTree的问题。
我用jTree来显示一个设备的结构,jTree的每个节点的数据基本上是这种结构[01-01],[01-02],[01-03],....
现在我遇到的问题是,有时候画这个tree 不能完整的显示出来,比如,某个结点它显示成[01...,
也就是后面的数字和]变成了省略号,特别困难的是,这个问题不是每次都重现,基本上
是100次碰上一次,而且每次画不完整的节点都不一样。不知道大家又没有碰到过类似的问题,
又是怎么解决的?非常感谢大家的帮忙,因为工程是一个商业软件,头儿非要我解决这个问题,
因为很难重现,所以我基本上是没有什么办法。
我用jTree来显示一个设备的结构,jTree的每个节点的数据基本上是这种结构[01-01],[01-02],[01-03],....
现在我遇到的问题是,有时候画这个tree 不能完整的显示出来,比如,某个结点它显示成[01...,
也就是后面的数字和]变成了省略号,特别困难的是,这个问题不是每次都重现,基本上
是100次碰上一次,而且每次画不完整的节点都不一样。不知道大家又没有碰到过类似的问题,
又是怎么解决的?非常感谢大家的帮忙,因为工程是一个商业软件,头儿非要我解决这个问题,
因为很难重现,所以我基本上是没有什么办法。
实际上,每个节点既有图标,也有字符串。结点的字符串还可能会修改,
10楼的大师说要计算字符串的宽度,应该怎么做呀?能不能提供一点code参考一下?
拜谢了!class IconNodeRenderer extends 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); Icon icon = ((IconNode) value).getIcon(); if (icon == null) {
Hashtable icons = (Hashtable) tree.getClientProperty("JTree.icons");
String name = ((IconNode) value).getIconName();
if ((icons != null) && (name != null)) {
icon = (Icon) icons.get(name);
if (icon != null) {
setIcon(icon);
}
}
} else {
setIcon(icon);
} return this;
}
}
实际上来说,节点的宽度在展现的时候已经都计算好了,能够完整的展现。
因为你的节点的Text可能会变化,但是这时候节点的当前大小并不会重新设置,那么你需要在节点Text变化的时候,调用model.reload() ————DefaultTableModel中的方法比如你接受到一个节点改变的消息,应该是通过model进行处理的吧:
model......;//处理节点
model.reload();//重要至于setPreferredSize,基本上没什么大的作用,只是为了保险一些。
FontMetrics ms = getFontMetrics(getFont());
int width = ms.stringWidth(getText()) + getInsets().left + getInsets().right + 图片宽度;
setPreferredSize(new Dimension(width,getHeight()));
重新开始建的。也就是说数的model都是重新来一遍的。代码如下:
public void initTreeView(){
int index = m_frm.m_rfb.getOSDListMode();
String treeLabel = "";
jComboBoxViewSelection.setSelectedIndex(index);
synchronized(m_frm.m_rfb.m_iCard.PortName) {
iCardTreeNode data = new iCardTreeNode("root",255,255);
root = new IconNode(data);
int count = 0 ;
for(int j=0 ; j<16 ; j++)
{
if(m_frm.m_rfb.m_iCard.portNo[j]==0) break ;
if(m_frm.m_rfb.m_iCard.portNo[j]>0 && m_frm.m_rfb.m_iCard.portNo[j] <= 16)
{
Formatter fmt = new Formatter();
fmt.format("[%02d-%02d]",j+1,m_frm.m_rfb.m_iCard.portNo[j]) ;
data = new iCardTreeNode(fmt.toString(),j,255);
IconNode node = new IconNode(data) ;
node.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/root1.gif"))); count ++ ;
for(int i=0; i <m_frm.m_rfb.m_iCard.portNo[j];i++)
{
if(isItemWanted(j,i))
{
String pn = "" ;
// synchronized(m_frm.m_rfb.m_iCard.PortName) {
pn = String.format("%-12.12s",m_frm.m_rfb.m_iCard.PortName[j][i]);
// }
if(pn.length()>12)
pn="portname>12" ;
treeLabel = String.format("[%02d-%02d] %-12.12s",j+1,i+1,pn) ;
if(treeLabel.length()>33)
treeLabel = treeLabel.substring(0,33);
data = new iCardTreeNode(treeLabel,j,i);
IconNode node1 = new IconNode(data) ;
if(m_frm.m_rfb.getPowerStatus(j,i)==1)
{
if(m_frm.m_rfb.getQuickViewStatus(j,i)==1)
{
node1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/quickview.gif")));
}
else
{
node1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/poweron2.gif")));
}
}
else
{
if(m_frm.m_rfb.getQuickViewStatus(j,i)==1)
{
node1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/quickviewoff.gif")));
}
else
{
node1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/poweroff.gif")));
}
}
node.add((IconNode)node1);
}
}
root.add((IconNode)node);
}
}
TreeModel treeModel = new DefaultTreeModel(root);
jTree1.setModel(treeModel);
IconNodeRenderer renderer = new IconNodeRenderer() ;
jTree1.setCellRenderer(renderer) ;
jTree1.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
TreeCellEditor textEditor = getTreeCellEditor();
ditor = new DefaultTreeCellEditor(jTree1, renderer, textEditor);
jTree1.setCellEditor(editor);
jTree1.setEditable(true);
jTree1.requestFocus();
}
}不管怎么样,回去先试试你提供的办法,明天来给你加分。非常感谢