2009-03-31 13 views
5

私はマルチ選択ロジックを実装するJTreeを持っています。JTree "ctrl"選択モードを常に有効にする方法

これは、マウス+ Ctrlキーを押しながらすべての選択を行うと効果的です。ユーザーがCtrlキーを押した状態で選択すると、ロジックが壊れます。

なぜそれが壊れているのかわかりませんが、Ctrlキーを押しながら選択が行われたことをTreeSelectionModelに常に示すことが考えられます。

あなたは何をお勧めしますか?

+0

いくつかのことを明確にする必要があります。

public class MultiSelectionTreeUI extends BasicTreeUI { @Override protected boolean isToggleSelectionEvent(MouseEvent event) { return SwingUtilities.isLeftMouseButton(event); } } 

そして、あなたJTreeの上のUIがいることを設定。 CTRL +左クリックでjtree内の複数のノードを選択できますが、左クリックすると1つしか選択されません。だからあなたが望むのは、ctrlが常に押されていて、クリックごとに選択肢を追加し続けるので、ツリーを動作させることです。 – willcodejavaforfood

+0

@willcodejavaforfood - まったく。 –

答えて

5

私はあなたがJTreeのとDefaultTreeSelectionModelを拡張する必要があります解決策

を見つけたと思います。

JTreeの関連するメソッド:

///////////////////////////////////////////////////// 
///////////////////////////////////////////////////// 
/// Implement selection using "adding" only logic. // 
///////////////////////////////////////////////////// 
///////////////////////////////////////////////////// 

@Override 
public void setSelectionPath(TreePath path) { 

    System.out.println("MLDebugJTree: setSelectionPath(" + path + ")"); 

    addSelectionPath(path); 

    return; 
    //super.setSelectionPath(path); 
} 

@Override 
public void setSelectionPaths(TreePath[] paths) { 

    System.out.println("MLDebugJTree: setSelectionPaths(" + paths + ")"); 

    addSelectionPaths(paths); 

    return; 
} 

@Override 
public void setSelectionRow(int row) { 

    System.out.println("MLDebugJTree: setSelectionRow(" + row + ")"); 

    addSelectionRow(row); 

    return; 
    //super.setSelectionRow(row); 
} 

@Override 
public void setSelectionRows(int[] rows) { 

    System.out.println("MLDebugJTree: setSelectionRows(" + rows + ")"); 

    addSelectionRows(rows); 

    return; 
    //super.setSelectionRows(rows); 
} 

DefaultSelectionModel関連するメソッド:

package com.ml.tree2.model.impl; 

import javax.swing.tree.DefaultTreeSelectionModel; 
import javax.swing.tree.TreePath; 

public class MLTreeSelectionModel extends DefaultTreeSelectionModel { 
private static final long serialVersionUID = -4270031800448415780L; 

@Override 
public void addSelectionPath(TreePath path) { 
    // Don't do overriding logic here because addSelectionPaths is ultimately called. 
    super.addSelectionPath(path); 
} 

@Override 
public void addSelectionPaths(TreePath[] paths) { 
    if(paths != null) { 
     for(TreePath path : paths) { 

      TreePath[] toAdd = new TreePath[1]; 
      toAdd[0] = path; 

      if (isPathSelected(path)) { 
       // If path has been previously selected REMOVE THE SELECTION. 
       super.removeSelectionPaths(toAdd); 
      } else { 
       // Else we really want to add the selection... 
       super.addSelectionPaths(toAdd); 
      } 
     } 
    } 
} 

HTH。

+0

ありがとう、私は十分にこれをupvoteすることはできません、これは私の検索の負荷を節約! –

2

別の解決策は、単にBasicTreeUIを拡張し、あなたのニーズに合わせて選択動作を変更するには、次のようになります。

JTree tree = new JTree(); 
tree.setUI(new MultiSelectionTreeUI()); 
+0

この解決策では別のL&F(p.ex. 'WindowsTreeUI')の代わりに' BasicUI'に戻りますが、これは一番きれいです。 –

関連する問題