我使用以下构造函数创建了一个合成:
Composite scrolledComposite =
new Composite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
每次使用鼠标滚轮时,垂直滚动值都会改变。
我知道这是默认行为,但我需要禁用它。我尝试从复合中removeMouseWheelListener
,但似乎这是本机调用。这是可以帮助理解我的问题的堆栈跟踪。
答案 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}}中有效。
请注意,在尝试滚动之前必须在文本内部单击,否则它将不是焦点控件。