2015-05-19 47 views
4

使用本手册(http://www.comp.nus.edu.sg/~cs3283/ftp/Java/swingConnect/tech_topics/tables-trees/tables-trees.html)我试图为我的项目的Swing用户界面创建树表。在Swing中创建TreeTable

在我的类表的构造我重新定义了渲染这样的:

public class JTreeTable extends JTable { 
    public JTreeTable(ITreeTableModel treeTableModel) { 
     super(); 
     ... 
     setDefaultRenderer(ITreeTableModel.class, tree); 
     ... 
    } 

} 

其中treeTableModel是我实施

interface ITreeTableModel extends TreeModel 

在结果表看起来接近我想要的东西,但我有夫妇问题:

enter image description here

  1. 我的代码中的字段(ID)定义为Object,但它实际上代表数字(1,2,3等)。如何更改字段ID的表示形式?

  2. 我的表中的节点不扩展。 但是

    公众诠释getChildCount(对象parent_object_id)

返回数> 0

P.S.我知道可能没有足够的信息可以直接回答,但我至少需要指导我继续调查。

+1

'JTree'将使用该节点的'toString'方法来生成输出。您可以更改'toString'方法返回的内容或使用'TreeCellRenderer'(最好) – MadProgrammer

+0

@MadProgrammer谢谢您的建议。它适用于我(JTree将使用节点的toString方法来生成输出)。第二种方法有点复杂:-) –

+1

不要重新发明轮子,也不要打扰(不要轻易没有重写BasicsTreeXxx,无论是Renderer,都是模型,太难了XxxCellEditor没有优秀的知识)1.买Jide,2 。SwingX有非常好的解决方法 – mKorbel

回答

0

与你的第一个问题相关,你应该实现一个TreeCellRenderer。 猜你会做类似的东西:获取对象和呼叫的

//and override also all the other functions of TreeCellRenderer 
public Component getTreeCellRendererComponent(JTree tree, Object value, 
     boolean selected, boolean expanded, boolean leaf, int row, 
     boolean hasFocus) { 
    Component returnValue = null; 
    if ((value != null) && (value instanceof DefaultMutableTreeNode)) { 
     Object userObject = ((DefaultMutableTreeNode) value) 
      .getUserObject(); 
     if (userObject instanceof YourClass) { 
     YourClass yourElement = (YourClass) userObject; 
     if(col==0) titleLabel.setText(yourElement.getID()); 
     if(col==1) titleLabel.setText(yourElement.getName()); 
     if(col==2) titleLabel.setText(yourElement.getParentID()); 
     if (selected) { 
      renderer.setBackground(backgroundSelectionColor); 
     } else { 
      renderer.setBackground(backgroundNonSelectionColor); 
     } 
     renderer.setEnabled(tree.isEnabled()); 
     returnValue = renderer; 
     } 
    } 
    if (returnValue == null) { 
     returnValue = defaultRenderer.getTreeCellRendererComponent(tree, 
      value, selected, expanded, leaf, row, hasFocus); 
    } 
    return returnValue; 
    } 
} 

什么是目前发生在你的是,你的单元格渲染器的返回对象实例元素ID(DictionaryItem @ 11abb71为例),而不是getID()函数。

你可以找到TreeCellRenderer example.

关系到你的第二个问题的额外例子和信息,请参阅上TreeModel example的例子。也许你也可以尝试通过代码扩展行。 如果“+”图标更改为“ - ”,则可能意味着getChildCount运行良好,但它不工作的是getChild(int row),它将返回null或无效的树行元素。