【发布时间】:2015-03-25 21:51:30
【问题描述】:
我有一个Composite,我想在其上跟踪SWT.MouseEnter 和SWT.MouseExit 事件。但是,Composite 内部还有另一个 Composite,由于 FillLayout,它占用了整个区域。
一些示例代码来说明我在做什么:
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
public class EventListenerTest {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
// Set up the outer Composite
Composite outerComp = new Composite(shell, SWT.BORDER);
FillLayout fl = new FillLayout();
// fl.marginHeight = 15;
// fl.marginWidth = 15;
outerComp.setLayout(fl);
// Set up a nested Composite
Composite innerComp = new Composite(outerComp, SWT.BORDER);
// Set a listener on the outer Composite for a MouseEnter event
outerComp.addListener(SWT.MouseEnter, new Listener() {
@Override
public void handleEvent(Event e) {
System.out.println("Mouse ENTER event");
}
});
// Similarly, for a MouseExit event
outerComp.addListener(SWT.MouseExit, new Listener() {
@Override
public void handleEvent(Event e) {
Composite comp = (Composite) e.widget;
// Don't report if positioned over a child control
for (Control child : comp.getChildren()) {
if (!child.getBounds().contains(new Point(e.x, e.y)))
System.out.println("Mouse EXIT event");
}
}
});
outerComp.pack();
outerComp.layout();
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
return;
}
}
不幸的是,由于innerComp 填充了其父级的全部,outerComp 永远不会记录鼠标进入/退出事件除非我暴露了一点它的“区域” .
我可以通过在 FillLayout 上创建一些边距来暴露一点 outerComp(注释掉第 21-22 行),但这确实不理想。出于美学原因,我在outerComp 上不能有很大的边距,如果我将鼠标快速移动到复合材料上,将边距大小减小到 1 并不能始终检测到鼠标事件(我必须移动鼠标 非常缓慢超过 1px 的边距以触发)。
从我项目的设计角度来看,我实际上不应该知道 outerComp 包含什么(或控件嵌套的深度),因此在其子级上设置事件侦听器也不理想。
如果FillLayout 占用了它的所有区域,我还能在outerComp 上跟踪这些鼠标事件吗?
【问题讨论】:
标签: java swt mouseevent