[英]How to track mouse over SWT composite made from sub controls?
我創建了自己的控件:
我想跟蹤鼠標並添加了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
區域時獲取所有鼠標事件,並在離開時停止捕獲。
其中我認為第一種選擇可能是最好的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.