[英]How to track mouse EXIT/ENTER/HOVER over composite?
下面的代碼顯示:
1)復合完全忽略了HOVER。 如何啟用?
2)跟蹤ENTER / EXIT,但當鼠標進入子控制區域時,父復合接收EXIT事件。 如何使復合材料的這個中心區域成為復合材料?
public class TryHover {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
Composite composite = new Composite(shell, SWT.BORDER);
composite.setLayout(new GridLayout(1, false));
Label label1 = new Label(composite, SWT.BORDER);
label1.setText("Label 1");
Label label2 = new Label(composite, SWT.BORDER);
label2.setText("Label 2");
composite.addListener(SWT.MouseEnter, new Listener() {
@Override
public void handleEvent(Event event) {
System.out.println("ENTER");
}
});
composite.addListener(SWT.MouseExit, new Listener() {
@Override
public void handleEvent(Event event) {
System.out.println("EXIT");
}
});
composite.addListener(SWT.MouseHover, new Listener() {
@Override
public void handleEvent(Event event) {
System.out.println("HOVER");
}
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}
UPDATE
是的,同意,如果鼠標很慢,它也會產生HOVER。
然后問題是關於ENTER / EXIT:如何關閉子控件的EXIT?
SWT.MouseHover
僅在鼠標位於Composite
上方時觸發,並且不會移動幾分之一秒。
鼠標在Composite
上的每次移動都會觸發SWT.MouseMove
。
所以這真的取決於你想要達到的目標。
至於問題的第二部分:SWT不會在窗口小部件層次結構中傳播事件(有一些例外)。
但是,您可以實現自己的邏輯來確定何時收聽事件。
SWT.MouseExit
:獲取鼠標的坐標並檢查是否有任何子項包含鼠標。 如果是這樣,什么都不做,如果沒有,你就離開了Composite
。 SWT.MouseEnter
:這有點棘手。 我想出了一個解決方案,它使用顯示屏上的過濾器跟蹤鼠標移動的當前Widget
。 輸入Composite
,可以檢查上一個窗口小部件是否為子項。 如果是這樣,什么也不做。 private static Widget mouseControl = null;
public static void main(String[] args)
{
Display display = new Display();
/* Overall, keep track of the Widget the mouse is moving over */
display.addFilter(SWT.MouseMove, new Listener()
{
@Override
public void handleEvent(Event e)
{
mouseControl = e.widget;
}
});
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Composite composite = new Composite(shell, SWT.BORDER);
composite.setLayout(new GridLayout(1, false));
Label label1 = new Label(composite, SWT.BORDER);
label1.setText("Label 1");
Label label2 = new Label(composite, SWT.BORDER);
label2.setText("Label 2");
composite.addListener(SWT.MouseEnter, new Listener()
{
@Override
public void handleEvent(Event event)
{
/* Check if the mouse was previously moving over a child (you could
* even do recursive search here) */
for (Control child : composite.getChildren())
{
if (child.equals(mouseControl))
return;
}
System.out.println("ENTER");
}
});
composite.addListener(SWT.MouseExit, new Listener()
{
@Override
public void handleEvent(Event event)
{
/* Check if the mouse is now located over a child (you could
* even do recursive search here) */
for (Control child : composite.getChildren())
{
if (child.getBounds().contains(new Point(event.x, event.y)))
return;
}
System.out.println("EXIT");
}
});
composite.addListener(SWT.MouseHover, new Listener()
{
@Override
public void handleEvent(Event event)
{
System.out.println("HOVER");
}
});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
}
不確定,為什么Hover會被你忽略。 我可以看到,它被跟蹤(請參見屏幕截圖),鼠標停留在復合材料上至少一秒鍾。 您的代碼未經任何修改即可使用。
可能它與OS有某種關系? 嘗試調用composite.setEnabled(true);
因為禁用的控件不會收到鼠標事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.