我创建了自己的控件:
我想跟踪鼠标并添加了一个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();
}
}
}
最佳答案
如果您只想获取鼠标移动事件,您可以向 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");
}
});
如果您将相同的 Listener 实例添加到 MyComposite
的所有子级,那么您可以捕获所有鼠标移动事件。
或者,您可以使用 Display.addFilter
捕获所有鼠标事件,并过滤发生在您的 Composite
实例或其任何子实例上的鼠标事件。
第三种选择是使用 Composite.setCapture
在鼠标进入 Composite
区域时获取所有鼠标事件,并在离开时停止捕获。
在这些之中,我认为第一个选项可能是性能最好的。
关于java - 如何在由子控件制作的 SWT 复合 Material 上跟踪鼠标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16543662/