2010-09-18 37 views
2

我有一個具有描述(String)和優先級值(int)的自定義對象。我將這些值顯示在JTree中,因爲此類型的不同對象之間存在層次關係。我只在JTree節點中顯示說明,因爲顯示的目的優先級並不重要。如何修改TreeCellEditor的默認編輯行爲(Java)

我想在編輯JTree節點(葉或節點)時彈出一個JDialog - 例如按F2。這個對話框將被用於編輯這兩個的描述和優先級。

如何阻止JTree將文本默認編輯爲文本字段並調用自定義對話框?

我想一個簡單的方法是繼承DefaultTreeCellEditor類並重寫isCellEditable方法。然後,我會在那裏調用JDialog(當我實例化自定義的DefaultTreeCellEditor時,我可以獲得相關的初始化元素),並簡單地返回false以防止默認編輯 - 但這對我來說似乎不夠優雅。

回答

2

作爲替代,考慮org.netbeans.swing.outline.Outline,進一步討論here

+0

我喜歡我所看到的。這與GTK +製作其TreeView組件非常相似。這樣 - 您可以看到所有相關數據並可以對其進行編輯。在我的問題中顯示優先級不是必要的,但不會減損解決方案。我會進一步調查,謝謝。 – 2010-09-18 14:43:01

2

我想F2可以在你的樹節點上工作,因爲你叫JTree#setEditable(true)

F2裝訂安裝在BasicTreeUI#installKeyboardActions。你可以安裝你自己通常的方式結合:

JTree tree = new JTree(new String[]{"a", "b", "c"}); 
tree.setEditable(true); 
InputMap m = tree.getInputMap(JComponent.WHEN_FOCUSED); 
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0); 
m.put(ks, "actionMapKey"); 
tree.getActionMap().put("actionMapKey", new AbstractAction() { 
    public void actionPerformed(ActionEvent e) { 
     // do your stuff 
    } 
}); 

JComponent.WHEN_IN_FOCUSED_WINDOW一般超過JComponent.WHEN_FOCUSED首選的,但BasicTreeUI使用後者。

如果你想使用一個不同的密鑰,這是一個有點棘手刪除F2結合,因爲它是在父輸入地圖:

m.remove(ks); 
if(m.getParent() != null) 
    m.getParent().remove(ks);