应用程序上的鼠标事件 Window

Mouse Events on Application Window

我有一个 eclipse e4 应用程序。当 window 调整大小时,我正在尝试 运行 一些代码说 xyz()。问题是,在调整大小时,会多次调用调整大小侦听器,而我只想在用户调整大小后调用 xyz() 一次。我能想到的唯一方法是在 window 本身上捕获 mouseUp 事件,但想不出 API 来获得相同的结果。

示例代码

public class CTGHandler{
    @Execute
    public void execute(final EPartService partService, final EModelService modelService){
        MPart mPart = modelService.createModelElement(MPart.class);
        mPart.setLabel("CTGLive"); //$NON-NLS-1$
        mPart.setContributionURI("bundleclass://test.ui.ctg/test.ui.ctg.CTGPart"); //$NON-NLS-1$
        partService.showPart(mPart, PartState.ACTIVATE);
    }
}

public class CTGPart    {
    @Inject
    private IEventBroker eventBroker;

    @Inject
    public CTGPart(){
        //Do something here...
    }

    @PostConstruct
    public void init(final Composite parent){
        Composite grandParent = parent.getParent().getParent().getParent();
        System.out.println(grandParent); //Prints "Shell {CTGApp}"

        grandParent.addControlListener(new ControlListener() {              
            @Override
            public void controlResized(ControlEvent e){
                System.out.println(e); // Prints "ControlEvent{Shell {CTGApp} time=9286942 data=null}" multiple times for a single resize event
                // because there is no way the framework can understand if the resize was complete
                xyz();// called each time, but I want this to be called only once 
            }

            @Override
            public void controlMoved(ControlEvent e)
            {}
        });
        // MouseUp event on the application window so that xyz(); can be called once and we can get rid of grandParent.addControlListener(){...}
    }

}

您可能会发现使用 ScheduledFuture and a ScheduledExecutorService 推迟调整大小事件的处理会更好。

如果您保留对“未来”的引用,您可以取消前一个并安排一个新的。通过这种方式,您可以将在短时间内触发的许多事件折叠成一个稍微延迟的事件。您需要选择一个好的延迟时间来平衡将被吞噬的事件数与安排最后一个未来之后发生的延迟。

grandParent.addControlListener(new ControlListener() { 
    ScheduledExecutorService scheduledExecutorService =
        Executors.newScheduledThreadPool(1);
    ScheduledFuture scheduledFuture;
    @Override
    public void controlResized(ControlEvent e){
        if(scheduledFuture != null) {
            scheduledFuture.cancel();
        }
        scheduledFuture = scheduledExecutorService.schedule(new Callable() {
            public Object call() throws Exception {
                xyz();
                return null;
            }
            }, 1, TimeUnit.SECONDS);
    }

    @Override
    public void controlMoved(ControlEvent e)
    {}
});

如果您收到很多事件,您应该创建一个静态 Callable 而不是每次都创建一个新的。