0

org.dom4j.swing.DocumentTreeModelを使用して、解析されたDOMドキュメントからSwingJtreeを構築しています。treeModelの作成元のドキュメントを編集するとき、JtreeはtreeModel.reload()によってこれをすぐに反映することを期待しています。

問題は、Jtreeが最初に完全に折りたたまれ、次にツリーをクリックして展開されると、3つの「テスト」要素が表示されることです。ただし、この時点で、テスト要素を追加すると、この変更は反映されなくなります。Jtreeスイングが折りたたまれた状態の場合、ツリーに「テスト」要素を追加することによって行われた変更を反映できますが、Jtreeスイングが展開された場合は反映できません。

スイングJTreeが開いているかどうかに関係なく、より多くの「テスト」要素がリアルタイムで追加されることを完全に期待していました。

org.dom4j.swing.DocumentTreeModel treeModel = null;

DemoConstructor(){
         DOMReader dr = new DOMReader();
         org.dom4j.Document dom4jdocument = dr.read(browser.getDocument());

        //Create a split pane and display the tree .
        JScrollPane scrollPane = new JScrollPane(createTree(dom4jdocument));
ProgrammaticallyCalledToEditDoc();
ProgrammaticallyCalledToEditDoc();
ProgrammaticallyCalledToEditDoc();
}

private static void ProgrammaticallyCalledToEditDoc(){
dom4jdocument.addElement("test");
}

    private static Component createTree(org.dom4j.Document document) {
            treeModel = new DocumentTreeModel(document);
            TreeModelListener l = new TreeModelListener() {

                @Override
                public void treeStructureChanged(TreeModelEvent e) {
                    // TODO Auto-generated method stub
                    treeModel.reload();
                }

                @Override
                public void treeNodesRemoved(TreeModelEvent e) {
                    // TODO Auto-generated method stub
                    treeModel.reload();
                }

                @Override
                public void treeNodesInserted(TreeModelEvent e) {
                    // TODO Auto-generated method stub
                    treeModel.reload();
                }

                @Override
                public void treeNodesChanged(TreeModelEvent e) {
                    // TODO Auto-generated method stub
                    treeModel.reload();
                }
            };;;
            treeModel.addTreeModelListener(l);
            JTree tree = new JTree(treeModel);


            return tree;
        }
4

1 に答える 1

4

ほとんどの場合、DocumentTreeModelは、そのタスクのように適切なTreeModelEventsを起動しません。リスナーでリロードを実行する意味はありません(完全な循環イベントがスローされます;-)、JTree自体がモデルをリッスンしており、挿入されたものを受信したときに何をすべきかを知っています。確認するには、リスナーメソッドに単純なprintlnを挿入します。

編集(「私は何を想定しているのか...」というコメントに答えて-ここでは簡単です)

1)何も-少なくともモデルに影響を与えるものは何もありません。正常に動作するモデルを使用すると、無限ループに陥ります(以下を参照)。

2)ループ(別名:完全な円形)は次のとおりです。

モデルがイベントを発生させる->リスナーがイベントを受信する->リスナーがモデルを変更する(model.reload)->モデルがイベントを発生させる->..。

于 2011-04-06T10:02:01.923 に答える