1

そんな困った。オーバーレイ データベース構造があり、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のようなメソッドが見つかりませんでした。

4

2 に答える 2

1

fireTreeModelChanged()モデルがそのようなメソッドを含むクラスを拡張した場合にのみ、メソッドが見つかります。しかし、関連付けられた包含メソッドTableModelを持つ とは異なり、ツリーにはそのようなクラスはありません。最善の策は、 を使用するか、独自のイベント起動メソッドを定義することです。AbstractTableModelfireXxx()DefaultTreeModel

もちろん、それらを実装できるようにするには、addTreeModelListener()何もしないのではなく、実際にメソッドにリスナーを追加する必要があります。

コードで変更する必要があるもう 1 つの点は、ハッシュ コードの比較です。そんなことをしても意味がありません。ところで、2 つの異なるクラスが同じハッシュ コードを持つ可能性があります。使うだけ

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

また

parent instanceof MenuList
于 2012-11-25T16:28:34.077 に答える
0

あなたのコードは問題を解決するのに十分ではありません. しかし、これは動的ツリーの良い例です。

DynamicTreeDemoからdocs.oracle.com

DynamicTreeDemo.javaクラスをダウンロードしDynamicTree.javaて実行します。

于 2012-11-25T16:50:32.550 に答える