【问题标题】:Is there a Jythonic way to represent an XML file in a Swing tree?是否有一种 Jythonic 方法可以在 Swing 树中表示 XML 文件?
【发布时间】:2012-02-09 22:33:11
【问题描述】:

我有一个 XML 文件,我想在树中直观地表示它。如果我要这样做,我将不得不使用 Jython,而且我们的系统上只有 2.5.0 版本。我没有 Java 经验(并且很难阅读它),但有一点 Swing 经验(通过 Jython)并且听说我可以使用 JTree() 来做到这一点。我已经看到了一些 Java Swing 示例,但是有人知道 Jythonic 的方法吗?请注意,我只有某些 XML 解析器可用 - 我目前正在使用 xml.etree.ElementTree 中的那个。

编辑: 我试着模仿 Chui Tey 的例子,然后尝试了这个:

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.setTitle("Tree")        
        self.pack()
        self.setDefaultCloseOperation(swing.JFrame.DO_NOTHING_ON_CLOSE)
        self.windowClosing = self.exit
        self.setLocationRelativeTo(None)
        self.setVisible(True)
    def exit(self, event):
        System.exit(0)

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

不幸的是,当它到达self.contentPane.add(xmlTreeModel) 时会引发一个异常,说

TypeError: add(): 1st arg can't be coerced to java.awt.PopupMenu, java.awt.Component

我不能简单地通过将其添加到内容窗格来对其进行测试吗?

编辑:它缺少一个 JTree。使用此修复更新了代码。

【问题讨论】:

    标签: xml swing jython


    【解决方案1】:

    您需要通过子类化来实现javax.swing.tree.TreeModel

    下面是一些未经测试的代码。 大方地撒上印花以弄清楚发生了什么。

    from javax.swing.tree import TreeModel
    
    class XmlTreeModel(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]
    
      # ignore for now - not modifying XML
      def addTreeModelListener(self, listener): pass
      def removeTreeModelListener(self, listener): pass
      def valueForPathChanged(self, path, new_value): pass
    

    【讨论】:

    • 我试了一下并在我的问题中添加了代码。一个关于异常的快速谷歌刚刚返回了很多我看不懂的java,你有没有机会认出它?
    • 一个 JTree 使用 TreeModel 来获取它的数据。 self.contentPane.add(JTree(xmlTreeModel))
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2011-07-07
    • 2016-03-28
    • 2021-05-17
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多