我创建了自己的控件:

我想跟踪鼠标并添加了一个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
Run Code Online (Sandbox Code Playgroud)
如何将复合材料作为一个完整的东西而不是子零件进行跟踪?
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 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");
}
});
Run Code Online (Sandbox Code Playgroud)
如果向所有子项添加相同的Listener实例,MyComposite则可以捕获所有鼠标移动事件.
或者,您可以使用Display.addFilter捕获所有鼠标事件并过滤您Composite实例或其任何子项上发生的事件.
第三种选择是用于Composite.setCapture在鼠标进入Composite区域时获取所有鼠标事件,并在鼠标离开时停止捕获.
其中我认为第一种选择可能是最好的选择.
| 归档时间: |
|
| 查看次数: |
4744 次 |
| 最近记录: |