我遇到了这样的麻烦。我有一个覆盖数据库结构,并使用 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
的TableModel
不同,树没有这样的类。最好的办法是使用 DefaultTreeModel
或定义自己的事件触发方法。
当然,为了能够实现它们,您需要在 addTreeModelListener()
方法中实际添加侦听器,而不是不执行任何操作。
代码中应该更改的另一件事是哈希代码的比较。这样做是没有意义的。顺便说一句,两个不同的类可以具有相同的哈希代码。只需使用
parent.getClass().equals(MenuList.class)
或
parent instanceof MenuList
您的代码不足以解决您的问题。但这里有一个动态树的很好的例子。
来自docs.oracle.com
的动态树演示
下载类DynamicTreeDemo.java
并DynamicTree.java
然后运行它。