У меня есть простой графический интерфейс 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
.