1

SelectionListener が添付された JTree があります。リスナーは適切に機能しており、ツリー内のノードをクリックするたびに正しく通知されます。

ただし、ノードが選択されたときに常にハイライトされるとは限りません。実際、ノード上に視覚的な「ブルーボックス」を表示するには、2 回クリックする必要があります。

次のコードで、選択範囲を表示するために 2 回クリックする必要があるのはなぜですか?

JTree の作成

JTree tree = new JTree();
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setDragEnabled(true);
tree.setDropMode(DropMode.ON);
tree.expandRow(0);
tree.setModel(model.getActiveFilterModel());

リスナーの追加

tree.addTreeSelectionListener(new TreeSelectionListener() {
    @Override
        public void valueChanged(TreeSelectionEvent event) {
            JTree tree = (JTree) event.getSource();
            DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
            if (selectedNode != null) {
                model.setSelectedFilter((Filter) selectedNode.getUserObject());
            }
        }
});

編集:

ツリーで .setModel をもう一度呼び出したときにのみ発生するように見えることを追加したいと思います。

4

1 に答える 1

1

問題は、私がObserverパターンを使用していて、継続的にディスプレイを呼び出していたことでした(たとえば、JTree、update())。これ自体は問題ではありません。

ただし、更新呼び出しでは、基になるモデルがこれらの変更自体を実際に処理するときに、常にtree.setModel(...)を使用していました。setModel()を1回だけ呼び出すようにコードを切り替えたところ、すべてが完全に機能するようになりました。

于 2012-08-10T16:34:44.107 に答える