2015-05-19 126 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或無效的樹行元素。