Есть ли Jythonic способ представления файла XML в дереве Swing? - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть файл XML, который я хотел бы визуально представить в виде дерева.Если бы я сделал это, мне пришлось бы использовать Jython, и в нашей системе была доступна только версия 2.5.0.У меня нет опыта работы с Java (и мне трудно его читать), но я немного знаком с Swing (через Jython) и слышал, что я мог бы сделать это с помощью JTree ().Я видел несколько примеров этого на Java Swing, но кто-нибудь знает о 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 (): 1-й аргумент не может быть приведен к java.awt.PopupMenu, java.awt.Component

Не могу ли я проверить это, просто добавив его в панель содержимого?

РЕДАКТИРОВАТЬ: Отсутствует JTree.Обновлен код с этим исправлением.

1 Ответ

0 голосов
/ 10 февраля 2012

Вам необходимо реализовать 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
...