2012-02-11 26 views
2

我有一個簡單的Jython GUI,它在JTree中顯示一個XML文件。有沒有一種方法可以在樹模型中重寫,這將允許我自定義JTree中的節點的調用方式?或者我需要用像Java這樣的渲染器來做些什麼?如果可能的話,我正在尋找一種Jythonic的方式來做到這一點(而不是直接的Java)。我可以訪問Jython 2.5.0。我簡單的代碼看起來是這樣的:我可以改變Jython JTree如何顯示我的XML嗎?

from java import awt 
from javax import swing 
from java.lang import System 
from xml.etree import ElementTree 

class XmlTreeModel(swing.tree.TreeModel): 
    def __init__(self, etree): 
     self.etree = etree 
    def getRoot(self): 
     return self.etree.getroot() 
    def getChildCount(self, object): 
     return len(object) 
    def getChild(self, parent, index): 
     return parent[index] 

class Viewer(swing.JFrame): 
    def __init__(self): 
     super(Viewer, self).__init__() 
    def display(self, fileName): 
     xmlObject = ElementTree.parse(fileName) 
     xmlTreeModel = XmlTreeModel(xmlObject) 
     jTree = swing.JTree(xmlTreeModel) 
     self.contentPane.add(jTree) 
     self.contentPane.setPreferredSize(awt.Dimension(100, 200))   
     self.pack() 
     self.setDefaultCloseOperation(swing.JFrame.EXIT_ON_CLOSE) 
     self.setLocationRelativeTo(None) 
     self.setVisible(True) 

if __name__ == "__main__": 
    viewer = Viewer() 
    viewer.display('my.xml') 

眼下節點顯示爲<Element Category at 2>,我想改變他們,只是說從XML屬性「分類」,甚至更好,一些自定義的。

編輯: 我能夠延長翠鐵伊的回答讓我的樹通過改變DisplayNode略微顯示XML屬性:

class DisplayNode(object): 
    def __init__(self, node): 
     self.node = node 
    def __repr__(self): 
     return self.node.get('Name') 
    def __getitem__(self, item): 
     return self.node[item] 
    def __len__(self): 
     return len(self.node) 

類的實例,然後分別DisplayNode(self.etree.getroot())DisplayNode(parent[index]),創造。對於那些通過搜索引擎到達的人來說,這適用於我,因爲我知道我所有的XML節點都會有一個名爲Name的屬性。

回答

1

JTree在每個xml節點上調用repr(節點)以獲取要在樹的樹葉上顯示的內容的字符串表示形式。

您可以通過提供自己的repr方法來覆蓋它。

在下面的示例中,我已經在displaytext屬性中手動設置了該值。

from java import awt 
from javax import swing 
from java.lang import System 
from xml.etree import ElementTree 

class DisplayNode: 
    def __init__(self, node, displaytext): 
     self.node = node 
     self.displaytext = displaytext 
    def __repr__(self): 
     return self.displaytext 
    def __getitem__(self, item): 
     return self.node[item] 
    def __len__(self): 
     return len(self.node) 

class XmlTreeModel(swing.tree.TreeModel): 
    def __init__(self, etree): 
     self.etree = etree 
    def getRoot(self): 
     return DisplayNode(self.etree.getroot(), "Tree Root") 
    def getChildCount(self, object): 
     return len(object) 
    def getChild(self, parent, index): 
     return DisplayNode(parent[index], "Another Child") 

class Viewer(swing.JFrame): 
    def __init__(self): 
     super(Viewer, self).__init__() 
    def display(self, fileName): 
     xmlObject = ElementTree.parse(fileName) 
     xmlTreeModel = XmlTreeModel(xmlObject) 
     jTree = swing.JTree(xmlTreeModel) 
     self.contentPane.add(jTree) 
     self.contentPane.setPreferredSize(awt.Dimension(100, 200))   
     self.pack() 
     self.setDefaultCloseOperation(swing.JFrame.EXIT_ON_CLOSE) 
     self.setLocationRelativeTo(None) 
     self.setVisible(True) 

if __name__ == "__main__": 
    viewer = Viewer() 
    viewer.display('my.xml') 
相關問題