我有一个简单的Jython GUI,它在JTree中显示一个XML文件。我可以在树模型中覆盖一个方法,允许我自定义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属性中自定义。
编辑:
我能够扩展Chui Tey的答案,以便我的树通过稍微改变DisplayNode
来显示XML属性:
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
的属性。
答案 0 :(得分:1)
JTree在每个xml节点上调用repr(node)以获取在其树的叶子上显示的内容的字符串表示。
您可以通过提供自己的 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')