我有以下内容:
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();
}
}
...运行此命令表明当我滚动鼠标滚轮时:
...有什么办法可以防止滚动吗?我尝试将所有侦听器附加到画布和垂直滚动条,但除了我在此处添加的内容之外,什么也没有看到,所以我猜测这是在操作系统级别发生的(我使用的是 Windows Server 2022,Eclipse 是 2022- 09).
尝试使用较低级别的无类型事件监听器作为鼠标滚轮监听器。通过该侦听器,您可以使用
doit
标志来阻止事件被执行:
将
addMouseWheelListener
代码替换为
canvas.addListener(SWT.MouseVerticalWheel, event -> {
System.err.println("mouseScrolled: " + event.count);
event.doit = false;
});
这似乎适用于 macOS。