2

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

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

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

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

在此处输入图像描述

4

1 回答 1

5

您可以将 a 添加FilterDisplay侦听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,但它会在第二个中工作。


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

于 2013-09-04T12:32:40.780 回答