Могу ли я изменить способ отображения моего XML в Jython JTree? - PullRequest
2 голосов
/ 11 февраля 2012

У меня есть простой графический интерфейс Jython, который отображает XML-файл в JTree. Есть ли метод, который я могу переопределить в древовидной модели, который позволит мне настроить, как называются узлы в 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.

EDIT: Мне удалось расширить ответ Chui Tey, чтобы в моем дереве отображался атрибут XML, слегка изменив DisplayNode:

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 Ответ

1 голос
/ 15 февраля 2012

JTree вызывает repr (узел) для каждого узла xml, чтобы получить строковое представление того, что отображать на листьях его дерева.

Вы можете переопределить его, указав собственный метод 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')
...