Swing JTree自定义模型添加/删除/更改节点

Swing JTree自定义模型添加/删除/更改节点,swing,listener,jtree,treemodel,Swing,Listener,Jtree,Treemodel,我遇到了很多麻烦。我有一个覆盖数据库结构,并使用JTree显示项目。以下是我对模型的简化视图: public class MenuTreeModel implements TreeModel { private MenuList ml; public MenuTreeModel( MenuList ml ) { this.ml = ml; } @Override public void addTreeModelListener(TreeModelListener l) { } @

我遇到了很多麻烦。我有一个覆盖数据库结构,并使用JTree显示项目。以下是我对模型的简化视图:

public class MenuTreeModel implements TreeModel {
private MenuList ml;

public MenuTreeModel( MenuList ml ) {
    this.ml = ml;
}

@Override
public void addTreeModelListener(TreeModelListener l) {

}

@Override
public Object getChild(Object parent, int index) {
    if ( parent.getClass().hashCode() == MenuList.class.hashCode() ){
        return ((MenuList) parent).getStation(index);
    }
    if ( parent.getClass().hashCode() == MenuStations.class.hashCode() ){
        return ((MenuStations) parent).get(index);
    }
    return null;
}

@Override
public int getChildCount(Object parent) {
    if ( parent.getClass().hashCode() == MenuList.class.hashCode() ){
        return ((MenuList) parent).getSize();
    }
    if ( parent.getClass().hashCode() == MenuStations.class.hashCode() ){
        return ((MenuStations) parent).getSize();
    }
    return 0;
}

@Override
public int getIndexOfChild(Object parent, Object child) {
    if ( parent.getClass().hashCode() == MenuList.class.hashCode() ){
        return ((MenuList) parent).getIndexOf((MenuStations) child);
    }
    if ( parent.getClass().hashCode() == MenuStations.class.hashCode() ){
        return ((MenuStations) parent).getIndexOf((MenuCats) child);
    }
    return 0;
}

@Override
public Object getRoot() {
    return ml;
}

@Override
public boolean isLeaf(Object node) {
    return node.getClass().hashCode() == MenuCats.class.hashCode();
}

@Override
public void removeTreeModelListener(TreeModelListener l) {
    // TODO Auto-generated method stub

}

@Override
public void valueForPathChanged(TreePath path, Object newValue) {
    // TODO Auto-generated method stub

}

当我从ml或其内部项中移除某些内容时,树结构不会改变。我找不到任何像fireTreeModelChanged

这样的方法,如果您的模型扩展了一个包含此类方法的类,则只能找到一个方法
fireTreeModelChanged()
。但是与包含
fireXxx()
方法的相关
AbstractTableModel
不同,树没有这样的类。最好使用
DefaultTreeModel
,或者定义自己的事件触发方法

当然,为了能够实现它们,您需要在
addTreeModelListener()
方法中实际添加侦听器,而不是什么都不做

代码中应该更改的另一件事是哈希代码的比较。那样做毫无意义。顺便说一句,两个不同的类可能具有相同的哈希代码。只用

parent.getClass().equals(MenuList.class)


只有当模型扩展了包含此类方法的类时,才能找到方法
fireTreeModelChanged()
。但是与包含
fireXxx()
方法的相关
AbstractTableModel
不同,树没有这样的类。最好使用
DefaultTreeModel
,或者定义自己的事件触发方法

当然,为了能够实现它们,您需要在
addTreeModelListener()
方法中实际添加侦听器,而不是什么都不做

代码中应该更改的另一件事是哈希代码的比较。那样做毫无意义。顺便说一句,两个不同的类可能具有相同的哈希代码。只用

parent.getClass().equals(MenuList.class)


您的代码不足以解决您的问题。但这里有一个动态树的好例子

docs.oracle.com


下载类
DynamicTreeDemo.java
DynamicTree.java
,然后运行它。

您的代码不足以解决您的问题。但这里有一个动态树的好例子

docs.oracle.com


下载类
DynamicTreeDemo.java
DynamicTree.java
,然后运行它。

尝试treeStructureChanged()方法在哪个类中可以找到它?很抱歉,这是侦听器方法,添加对象后调用reload()方法。但如果您正确使用树模型,一切都会正常工作。好的,谢谢,我刚刚将它从默认模型源复制到了我的模型中。请尝试treeStructureChanged()方法在哪个类中可以找到它?抱歉,这是侦听器方法,请在添加对象后调用reload()方法。但如果你正确使用树模型,一切都会很好。好的,谢谢,我只是把它从默认模型源复制到我的模型中。实际上我不知道如何实现触发方法。很难找到答案,其实很简单。他们创建一个包含适当信息的TreeModelEvent实例,然后迭代所有已添加到模型中的侦听器,并调用其中一个
treeNodesXxx()
方法(适当的方法)。您可以随时查看DefaultTreeModel的源代码以了解它的功能。但是我认为你应该使用DefaultTreeModel,而不是自己设计,特别是如果你还不了解这些东西的话。>你可以随时查看DefaultTreeModel的源代码来了解它的功能“是的,这是关键。事实上,我不知道射击方法是如何实现的。很难找到答案,其实很简单。他们创建一个包含适当信息的TreeModelEvent实例,然后迭代所有已添加到模型中的侦听器,并调用其中一个
treeNodesXxx()
方法(适当的方法)。您可以随时查看DefaultTreeModel的源代码以了解它的功能。但是我认为你应该使用DefaultTreeModel,而不是自己设计,特别是如果你还不了解这些东西的话。>你可以随时查看DefaultTreeModel的源代码,看看它能做什么“是的,这是关键