我可以改变Jython JTree如何显示我的XML吗?

时间:2012-02-11 19:52:34

标签: xml swing jython

我有一个简单的Jython GUI,它在JTree中显示一个XML文件。我可以在树模型中覆盖一个方法,允许我自定义JTree中的节点被调用吗?或者我是否需要使用像Java这样的渲染器?如果可能的话,我正在寻找Jythonic的方法来做到这一点(而不是直接的Java)。我可以访问Jython 2.5.0。我的简单代码如下所示:

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属性中自定义。

编辑: 我能够扩展Chui Tey的答案,以便我的树通过稍微改变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 个答案:

答案 0 :(得分:1)

JTree在每个xml节点上调用repr(node)以获取在其树的叶子上显示的内容的字符串表示。

您可以通过提供自己的 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')