2012-02-11 4 views
2

私はJTreeにXMLファイルを表示するシンプルなJython GUIを持っています。ツリーモデルでオーバーライドできるメソッドはありますか?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属性から何かのカスタムを言うためにそれらを変更したいと思います。

EDIT: 私の木は少し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') 
関連する問題