gpt4 book ai didi

java - 应用程序窗口上的鼠标事件

转载 作者:行者123 更新时间:2023-11-30 03:35:06 25 4
gpt4 key购买 nike

我有一个 eclipse e4 应用程序。当窗口大小调整时,我试图运行一些代码,例如 xyz() 。问题是,在调整大小时,会多次调用调整大小监听器,而我只想在用户完成调整大小后调用 xyz() 一次。我能想到的唯一方法是捕获窗口本身的 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 推迟调整大小事件的处理会更好。和一个ScheduledExecutorService

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

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,而不是每次都创建一个新事件。

关于java - 应用程序窗口上的鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28175682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com