2012-02-09 17 views
0

我有一個XML文件,我想在樹中直觀地表示。如果我要這樣做,我不得不使用Jython,並且我們的系統上只有2.5.0版本可用。我沒有Java經驗(並且很難閱讀它),但是有一點Swing經驗(通過Jython),並且聽說我可以用JTree()來實現這一點。我已經看到了一些Java Swing的例子,但是有沒有人知道Jythonic的做法?請注意,我只有一些XML解析器可用 - 我正在使用xml.etree.ElementTree中的一個。是否有Jythonic方式在Swing樹中表示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.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。使用此修補程序更新了代碼。

回答

0

您需要通過子類實現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 
+0

我給了它一個嘗試,並添加了我的問題的代碼。一個快速的異常的谷歌只是返回了很多我不能讀取的Java,你有沒有機會認出它呢? – aeroNotAuto 2012-02-10 09:07:17

+0

JTree使用TreeModel來獲取其數據。 self.contentPane.add(JTree(xmlTreeModel)) – 2012-02-11 06:43:41

+0

哦,這是一個愚蠢的事情錯過。太好了,謝謝! – aeroNotAuto 2012-02-11 17:08:05

相關問題