2009-03-31 6 views
5

Ho un JTree che implementa la logica di selezione multipla.come impostare la modalità di selezione JTree "ctrl" per essere sempre abilitata

Questo funziona perfettamente quando faccio tutte le mie selezioni usando il mouse + il tasto Ctrl premuto. Se l'utente effettua selezioni con il tasto Ctrl non premuto, interrompe la mia logica.

Non riesco davvero a capire perché si interrompa, ma penso che una possibile soluzione sia quella di indicare sempre l'AlberoSelezioneModello che la selezione è stata fatta con il tasto Ctrl premuto.

Che cosa suggeriresti?

+0

necessità di chiarire alcune cose . Quindi CTRL + clic sinistro ti consente di selezionare più nodi nel jtree, ma quando fai clic con il pulsante sinistro del mouse ne selezioni solo uno? Quindi quello che vuoi è far funzionare l'albero mentre ctrl viene sempre premuto e continua ad aggiungere selezioni su ogni clic? – willcodejavaforfood

+0

@willcodejavaforfood - Esattamente. –

risposta

5

Credo di aver trovato la soluzione

Sarà necessario estendere la JTree e DefaultTreeSelectionModel.

JTree metodi rilevanti:

///////////////////////////////////////////////////// 
///////////////////////////////////////////////////// 
/// 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 metodi rilevanti:

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

grazie, non posso revocarlo abbastanza, questo mi ha risparmiato un sacco di ricerche! –

2

Un'altra soluzione sarebbe quella di estendere semplicemente BasicTreeUI e modificare il comportamento di selezione in base alle proprie esigenze:

public class MultiSelectionTreeUI extends BasicTreeUI 
{ 

    @Override 
    protected boolean isToggleSelectionEvent(MouseEvent event) 
    { 
     return SwingUtilities.isLeftMouseButton(event); 
    } 
} 

e quindi impostare che ui sul JTree:

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

Tornerai a 'BasicUI' invece di un altro L & F (p.ex.' WindowsTreeUI') con questa soluzione, ma è la più pulita. –