java未调用JTree树模型的getIndexOfChild()
我已经为JTree
组件创建了一个自定义的TreeModel
。我找到了
它的getIndexOfChild()
方法从未被调用。唯一的信息
关于这个方法,我发现了一条模糊的消息:这不是在JTree的默认模式下调用的:使用一个朴素的实现,它在多个创建自定义树模型的示例中反复出现,例如here或here。
即使在官方Swing教程的Genealogy example中,也实现了该方法,但从未调用过。文档中没有解释
为什么从未调用此方法?如果上面的信息是正确的,那么
一个JTree
的默认模式?是否存在调用该方法的模式
以后编辑
似乎getChild()
和getIndexOfChild()
方法在某种程度上是不正确的
联系在一起。如果getChild()
方法返回File
对象或String
对象,由于某种原因,不会调用getIndexOfChild()
。如果
它返回一个自定义对象,甚至返回一个new Object()
下面是一个小示例,其中重现了该问题:
package com.zetcode;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
class MyModel implements TreeModel {
private final String root;
private final ArrayList lst;
private final HashMap map;
public MyModel(String root) {
this.root = root;
lst = new ArrayList();
lst.add("Lenovo");
lst.add("Coca cola");
lst.add("Mercedes");
lst.add("Wilson");
map = new HashMap();
map.put(root, lst);
}
@Override
public Object getRoot() {
return root;
}
@Override
public boolean isLeaf(Object node) {
return !node.equals("Brands");
}
@Override
public int getChildCount(Object parent) {
ArrayList list = (ArrayList) map.get((String) parent);
return list.size();
}
@Override
public Object getChild(Object parent, int idx) {
ArrayList list = (ArrayList) map.get((String) parent);
return list.get(idx);
}
@Override
public int getIndexOfChild(Object parent, Object child) {
System.out.println("getIndexOfChild");
return -1;
}
@Override
public void valueForPathChanged(TreePath path, Object newValue) {
}
@Override
public void addTreeModelListener(TreeModelListener l) {
}
@Override
public void removeTreeModelListener(TreeModelListener l) {
}
}
public class TreeModelEx extends JFrame {
public TreeModelEx() {
initUI();
}
private void initUI() {
createTree();
setTitle("TreeModel");
setSize(400, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void createTree() {
String root = "Brands";
MyModel model = new MyModel(root);
JTree tree = new JTree(model);
add(new JScrollPane(tree));
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
TreeModelEx ex = new TreeModelEx();
ex.setVisible(true);
}
});
}
}
如果我们启动这个示例,消息System.out.println("getIndexOfChild");
未打印到控制台
# 1 楼答案
因为你没有告诉它打印,所以你只是在打印文本
试试这个
System.out.println(getIndexOfChild);
# 2 楼答案