我创建了自己的控件:
我想跟踪鼠标并添加了MouseTrackListener
。不幸的是,当鼠标移动到我的复合部分(即标签和按钮)时,也会生成MouseEnter
和MouseLeave
个事件。
[Mouse enter] - mouse enters the empty space
[Mouse hover] - mouse is over the empty space
[Mouse exit] - mouse moved over label
[Mouse enter] - mouse leaves label and enters empty space
[Mouse hover] - mouse over empty space
[Mouse exit] - mouse leaves composite
如何将复合材料作为一个完整的东西而不是子零件进行跟踪?
public class MyComposite extends Composite {
public MyComposite(final Composite parent, final int style) {
super(parent, style);
final Label lbl = new Label(this, SWT.NONE);
lbl.setBounds(10, 10, 78, 15);
lbl.setText("My Composite");
final Button btn = new Button(this, SWT.NONE);
btn.setBounds(190, 29, 75, 25);
btn.setText("Ok");
pack();
}
public static void main(final String[] args) {
final Shell shell = new Shell(Display.getDefault());
shell.setText("Testcase");
shell.setLayout(new FillLayout());
final MyComposite comp = new MyComposite(shell, SWT.NONE);
comp.addMouseTrackListener(new MouseTrackListener() {
@Override
public void mouseHover(final MouseEvent e) {
System.out.println("[Mouse hover]");
}
@Override
public void mouseExit(final MouseEvent e) {
System.out.println("[Mouse exit]");
}
@Override
public void mouseEnter(final MouseEvent e) {
System.out.println("[Mouse enter]");
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}
答案 0 :(得分:5)
如果您只想获得鼠标移动事件,可以将无类型事件添加到Composite
。它应该像
final Composite comp = new Composite(shell, org.eclipse.swt.SWT.NONE);
comp.addListener(SWT.MouseMove, new Listener() {
public void handleEvent(Event event) {
System.out.println("hit");
}
});
如果向MyComposite
的所有子项添加相同的Listener实例,则可以捕获所有鼠标移动事件。
或者,您可以使用Display.addFilter
来捕获所有鼠标事件,并过滤Composite
实例或其任何子项上发生的事件。
第三种选择是当鼠标进入Composite.setCapture
区域时使用Composite
获取所有鼠标事件,并在鼠标离开时停止捕获。
其中我认为第一种选择可能是最好的选择。