2013-09-04 4 views
2

I a créé un composite en utilisant le constructeur suivant:Désactiver MouseWheel dans un composite SWT

Composite scrolledComposite = 
    new Composite(parent, SWT.V_SCROLL | SWT.H_SCROLL); 

Chaque fois que j'utilise la molette de la souris, la valeur de défilement verticale est modifiée.

Je sais que c'est le comportement par défaut, mais je dois le désactiver. J'ai essayé de removeMouseWheelListener à partir du composite, mais il semble que ce soit un appel natif. C'est le stacktrace qui pourrait aider à comprendre mon problème.

enter image description here

Répondre

5

Vous pouvez ajouter un Filter au Display qui écoute les SWT.MouseWheel événements. Voici un exemple pour Text, mais il fonctionne de manière identique pour Composite:

public static void main(String[] args) 
{ 
    Display display = Display.getDefault(); 
    final Shell shell = new Shell(display); 
    shell.setText("StackOverflow"); 
    shell.setLayout(new GridLayout(1, false)); 

    // This text is not scrollable 
    final Text text = new Text(shell, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); 
    text.setLayoutData(new GridData(GridData.FILL_BOTH)); 

    text.setText("a\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\n"); 

    // This is the filter that prevents it 
    display.addFilter(SWT.MouseWheel, new Listener() 
    { 
     @Override 
     public void handleEvent(Event e) 
     { 
      // Check if it's the correct widget 
      if(e.widget.equals(text)) 
       e.doit = false; 
      else 
       System.out.println(e.widget); 
     } 
    }); 

    // This text is scrollable 
    final Text otherText = new Text(shell, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); 
    otherText.setLayoutData(new GridData(GridData.FILL_BOTH)); 

    otherText.setText("a\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\n"); 

    shell.pack(); 
    shell.open(); 
    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

Cela permettra d'éviter le défilement dans la première Text, mais il fonctionnera dans le second. Notez que vous devez cliquer à l'intérieur du texte avant d'essayer de faire défiler, car sinon ce ne serait pas le contrôle de mise au point.

+0

A travaillé parfaitement, merci !! –

+0

@ DanielPeñalba Glad je pourrais aider :) – Baz

Questions connexes