2014-09-22 56 views
0

我的問題也與這個鏈接有關。 http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html#data在jtree中編輯節點值時,我需要一個偵聽器來跟蹤,但我應該怎麼做?

我正在修改使用Jtree的解析器程序。在我的程序中創建Jtree的方式與我在上面發佈的鏈接中的示例非常相似。我們稱之爲CREATE-JTREE-METHOD-1。

DefaultMutableTreeNode top = 
    new DefaultMutableTreeNode("The Java Series"); 
createNodes(top); 
tree = new JTree(top); 
... 
JScrollPane treeView = new JScrollPane(tree); 
... 

private void createNodes(DefaultMutableTreeNode top) { 
    DefaultMutableTreeNode category = null; 
    DefaultMutableTreeNode book = null; 

    category = new DefaultMutableTreeNode("Books for Java Programmers"); 
    top.add(category); 

    book = new DefaultMutableTreeNode(new BookInfo 
     ("The Java Tutorial: A Short Course on the Basics", 
     "tutorial.html")); 
    category.add(book); 
    ... 
} 

基本上與一個JTree「頂部」節點被首先創建,然後用文本值的節點進行「添加」到「頂部」節點,因爲它們被解析出來。

我的工作是嘗試手動更改單個節點的值,並在此事件偵聽器中執行某些操作。

在我發佈的同一鏈接的「動態更改樹」部分。它提供了下面的例子來實現節點更改偵聽器,

rootNode = new DefaultMutableTreeNode("Root Node"); 
treeModel = new DefaultTreeModel(rootNode); 
treeModel.addTreeModelListener(new MyTreeModelListener()); 

tree = new JTree(treeModel); 

然而,此JTree使用DefaultTreeModel的構造(我們稱之爲CREATE-JTree的法-2)。它沒有提供關於如何將數據添加到模型的示例代碼。

我不知道是否有方法從用方法1創建的Jtree中獲取數據模型,然後使用addTreeModelListener()方法如圖所示?換句話說,方法1確實也使用了DefaultTreeModel嗎?

我試圖尋找類似getDefaultTreeModel()的東西,但沒有成功。

如果上面的樹模型的東西不起作用,任何其他方式我可以做一個軌道到Jtree上更改節點值?

由於提前,

+1

'JTree#getModel()#addTreeModelListener' ...監聽器合約在「TreeMode」中指定l'。將一個節點傳遞給'JTree'只是簡單地將它包裝在一個'DefaultTreeModel'中......或者其他的一些 – MadProgrammer 2014-09-22 09:02:01

+0

* grml *我沒有閱讀你的評論@MadProgrammer - 會爲我節省很多工作^^:非常精確,非常正確! – 2014-09-22 10:42:48

+0

@MadProgrammer謝謝你的回覆。另一個簡短的問題是,我想在更改節點之前和之後獲取值。我注意到在用戶界面中單擊選擇節點,第二次點擊會將其置於編輯模式。爲了在編輯之前獲得值,我不希望在每次節點被SELECTED時讀取,但是在EDITED之前。任何聽衆都只是爲了那個? – user1559625 2014-09-22 11:15:38

回答

1

,你可以使用默認的樹模型創建樹...

...後來通過簡單地從樹上得到它retrive該模型(是的,你是對的,但它工作^^

DefaultMutableTreeNode root = new DefaultMutableTreeNode("root"); 
DefaultTreeModel model = new DefaultTreeModel(root); 
JTree tree = new JTree(model); 

DefaultTreeModel model2 = (DefaultTreeModel)tree.getModel; //<-- you'll have to cast it! 

,但你想從JTree的directrly得到根節點......它不是直接accessable ...閱讀源代碼顯示:

/** 
* Creates a new <code>JTree</code> object. 
* 
* @param root the root node 
*/ 
public JTree(TreeNode root) 
{ 
    this(root, false); 
} 

/** 
* Creates a new <code>JTree</code> object. 
* 
* @param root the root node 
* @param asksAllowChildren if false, all nodes without children are leaf 
*  nodes. If true, only nodes that do not allow children are leaf 
*  nodes. 
*/ 
public JTree(TreeNode root, boolean asksAllowChildren) 
{ 
    this(new DefaultTreeModel(root, asksAllowChildren)); 
} 

(從http://developer.classpath.org/doc/javax/swing/JTree-source.html)當您創建一個根節點tableModle是總是創建的JTree

...(當你寫new JTree(new TreeNode());

像這樣 - 只是跳過部分地方你創建一個具有根節點的JTree,並按照上面的建議 - 使用treeModel創建它..在那裏你可以添加(如你自己所建議的)樹模型偵聽器

+0

嗨,馬丁,如果我用DefaultTreeModel創建jtree,那麼確定我可以將其恢復。但正如我所說,我用「top.add()」函數創建了jtree,這種「添加」也適用於一個看不見的DefaultTreeModel,我可以恢復它? – user1559625 2014-09-22 09:22:59

相關問題