可以阻止 SWT Canvas 在鼠标滚轮上的默认滚动吗?

问题描述 投票:0回答:1

我有以下内容:

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;

public class SSCCE {

public static void main (String [] args) {
    Display display = new Display ();
    Shell shell = new Shell (display);
    shell.setLayout(new FillLayout());      
    Canvas canvas = new Canvas (shell, SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE | SWT.V_SCROLL | SWT.H_SCROLL);
    ScrollBar hBar = canvas.getHorizontalBar ();
    ScrollBar vBar = canvas.getVerticalBar ();
    
    hBar.addSelectionListener (new SelectionListener() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            System.err.println("hBar: "+vBar.getSelection());               
            canvas.redraw();                
        }
        @Override
        public void widgetDefaultSelected(SelectionEvent e) {
            widgetSelected(e);              
        }
    });
    
    vBar.addSelectionListener (new SelectionListener() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            System.err.println("vBar: "+vBar.getSelection());               
            canvas.redraw();                
        }
        @Override
        public void widgetDefaultSelected(SelectionEvent e) {
            widgetSelected(e);              
        }
    });
    
    canvas.addMouseWheelListener(new MouseWheelListener() {
        @Override
        public void mouseScrolled(MouseEvent e) {
            System.err.println("mouseScrolled: "+e.count);
        }
    });
    
    canvas.addControlListener(new ControlListener(){
        @Override
        public void controlMoved(ControlEvent e) {
            // I don't care ...
        }
        @Override
        public void controlResized(ControlEvent e) {
            canvas.redraw();
        }
    });
    
    canvas.addPaintListener(new PaintListener() {
        @Override
        public void paintControl(PaintEvent e) {
            e.gc.setBackground(display.getSystemColor(SWT.COLOR_RED));
            e.gc.fillRectangle(canvas.getBounds());         
        }
    });

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

}

...运行此命令表明当我滚动鼠标滚轮时:

  1. 我添加的 MouseWheelListener 捕获了事件 (good)
  2. 垂直滚动条也会滚动(bad

...有什么办法可以防止滚动吗?我尝试将所有侦听器附加到画布和垂直滚动条,但除了我在此处添加的内容之外,什么也没有看到,所以我猜测这是在操作系统级别发生的(我使用的是 Windows Server 2022,Eclipse 是 2022- 09).

java eclipse swt eclipse-rcp
1个回答
0
投票

尝试使用较低级别的无类型事件监听器作为鼠标滚轮监听器。通过该侦听器,您可以使用

doit
标志来阻止事件被执行:

addMouseWheelListener
代码替换为

canvas.addListener(SWT.MouseVerticalWheel, event -> {
   System.err.println("mouseScrolled: " + event.count);

   event.doit = false;
});

这似乎适用于 macOS。

© www.soinside.com 2019 - 2024. All rights reserved.