2012-02-11 1 views
2

JTree에 XML 파일을 표시하는 간단한 Jython GUI가 있습니다. JTree의 노드가 호출되는 것을 사용자 정의 할 수있는 트리 모델에서 대체 할 수있는 메소드가 있습니까? 아니면 자바와 같은 렌더러로 뭔가를해야합니까? 가능한 경우 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 속성에서 "카테고리"또는 더 나은, 뭔가 정의 말을 변경하고 싶습니다. 클래스의

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])으로 작성됩니다

편집

: 내 나무 약간 DisplayNode을 변경하여 XML 속성을 표시하도록 나는 추이 테이의 답변을 확장 할 수 있었다. 모든 XML 노드에 Name이라는 속성이 있다는 것을 알고 있기 때문에 검색 엔진을 통해 도착한 사용자에게는 나를 위해 작동합니다.

답변

1

JTree는 각 xml 노드에서 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') 
관련 문제