在SWT组合中禁用MouseWheel

时间:2013-09-04 12:22:52

标签: java eclipse swt

我使用以下构造函数创建了一个合成:

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

每次使用鼠标滚轮时,垂直滚动值都会改变。

我知道这是默认行为,但我需要禁用它。我尝试从复合中removeMouseWheelListener,但似乎这是本机调用。这是可以帮助理解我的问题的堆栈跟踪。

enter image description here

1 个答案:

答案 0 :(得分:5)

您可以向监听Filter个事件的Display添加SWT.MouseWheel。以下是Text的示例,但它对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();
}

这样可以防止在第一个Text中滚动,但它会在第二个{{1}}中有效。


请注意,在尝试滚动之前必须在文本内部单击,否则它将不是焦点控件。