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