有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java未调用JTree树模型的getIndexOfChild()

我已经为JTree组件创建了一个自定义的TreeModel。我找到了 它的getIndexOfChild()方法从未被调用。唯一的信息 关于这个方法,我发现了一条模糊的消息:这不是在JTree的默认模式下调用的:使用一个朴素的实现,它在多个创建自定义树模型的示例中反复出现,例如herehere。 即使在官方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"); 未打印到控制台


共 (2) 个答案

  1. # 1 楼答案

    因为你没有告诉它打印,所以你只是在打印文本

    试试这个System.out.println(getIndexOfChild);

  2. # 2 楼答案

    System.out.println(getIndexOfChild(parent, child));