1

データベースから取り込まれた JTree を使用しています。

ツリーは、ルート ノードとその子ノードにカスタム オブジェクトを次のように設定することで作成されます。

private DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Categorias");
...
ResultSet primaryCategories = dbm.fetchAllCategories();
while (primaryCategories.next()){
    Category category = new Category(primaryCategories.getLong("_id"), 
            primaryCategories.getString("category"));
    DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(category);
    rootNode.add(childNode);

    ResultSet currentSubcategory = dbm.fetchChildSubcategories(category.getCatId());
    while (currentSubcategory.next()){
        Category subcategory = new Category(currentSubcategory.getLong("_id"), 
                currentSubcategory.getString("category"));
        childNode.add(new DefaultMutableTreeNode(subcategory, false));
    }
}
...

この後、ツリーは完全に作成されます。" Category " オブジェクトが取り込まれ、すべてのオブジェクトには独自の ID 番号と toString() メソッドで使用する名前があります。

問題は、編集可能に設定したときに発生します。ノードの名前が変更されると、カテゴリノードも文字列オブジェクトに変換されるため、新しいカテゴリ名の値をデータベースに更新できません。

名前変更イベントをキャプチャしようとしましたtreeNodesChanged(TreeModelEvent e)が、userObject は既に String オブジェクトに変更されており、編集されたオブジェクトの参照を取得できません。

これをどのように解決できますか?表示されているツリーのコピーと、データベースからダウンロードした別のツリーのコピーを用意し、変更が発生するたびに両方を更新する必要がありますか?

* PD: * また、メソッドをオーバーライドするモデルから変更されたノードを取得しようとしました:

public void nodeChanged(TreeNode newNode) {
   DefaultMutableTreeNode parent = ((DefaultMutableTreeNode)newNode.getParent());
    int index = getIndexOfChild(parent, newNode);
    DefaultMutableTreeNode oldNode = (DefaultMutableTreeNode) getChild(parent, index);
    System.out.println(parent.getUserObject().getClass().toString());
    System.out.println(oldNode.getUserObject().getClass().toString());          
}

これは次のように表示されます:

class com.giorgi.commandserver.entity.Category
class java.lang.String

したがって、ここの古いノードはすでに文字列に変更されており、古いカテゴリとその ID への参照が完全に失われたため、データベースで更新できません。

どんな助けでも大歓迎です。

4

2 に答える 2

3

さて、それは少し掘り下げました。

基本的に、編集が「停止」すると、 はJTreeエディターの を介してエディターの値を要求しますgetCellEditorValue。これは、メソッドを介してモデルに渡され、valuesForPathChanged最終的にノードのsetUserObjectメソッドが呼び出されます。

おそらく、デフォルトのエディターまたはテキスト フィールドに基づくエディターのいずれかを使用しています。これは値を返しStringます。

必要なことは、変更をsetUserObjectツリー ノードのメソッドにトラップし、値にアクセスし (つまり、aStringかどうかを確認し)、必要に応じて更新することです。

于 2012-10-10T22:06:08.277 に答える
1

最終的な解決策は、MadProgrammer が言ったとおりです。

public void valueForPathChanged(TreePath path, Object newValue) {
        DefaultMutableTreeNode aNode = (DefaultMutableTreeNode)path.getLastPathComponent();
        Category catNode = (Category) aNode.getUserObject();
        catNode.setCategory((String) newValue);
        catNode.updateFromDatabase();
        nodeChanged(aNode);
    }
于 2012-10-10T21:44:04.530 に答える