Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有Jythonic方法在Swing树中表示XML文件?_Xml_Swing_Jython - Fatal编程技术网

是否有Jythonic方法在Swing树中表示XML文件?

是否有Jythonic方法在Swing树中表示XML文件?,xml,swing,jython,Xml,Swing,Jython,我有一个XML文件,我想在树中直观地表示它。如果我要这样做,我必须使用Jython,我们的系统上只有2.5.0版可用。我没有Java经验(并且很难阅读),但是有一点Swing经验(通过Jython),并且听说我可以用JTree()实现这一点。我见过一些JavaSwing的例子,但是有人知道Jythonic的方法吗?请注意,我只有某些XML解析器可用-我目前正在使用XML.etree.ElementTree中的解析器 编辑: 我试着模仿崔泰的例子,并尝试这样做: from java import

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

编辑: 我试着模仿崔泰的例子,并尝试这样做:

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():无法将第一个参数强制为java.awt.PopupMenu,java.awt.Component

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

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

您需要通过子类化来实现

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

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

我尝试了一下,并在我的问题中添加了代码。一个快速的异常google返回了很多我看不懂的java,你有没有可能认出它?一个JTree使用TreeModel来获取它的数据。self.contentPane.add(JTree(xmlTreeModel))