我确实在这个任务中看到了其他线程。推荐的答案几乎就是我实现的,请参阅下面的代码。代码在Windows上工作得有点好(稍微摇晃一下),但是在大多数情况下,应用程序只是锁定CENTOS。我假设应用程序进入无限循环或其他什么。
我的想法是添加一个Java等价的C#.Net Application.DoEvents(),但是我找不到怎么做,而SO上的其他线程认为这是一个不正确的解决方案,应该花时间实现一个适当的解决方案。
Windows上的问题是,当我调整应用程序的大小时,我会看到应用程序的简要轮廓/ flash以用户想要的大小,然后是保持宽高比的最终大小。我宁愿干净,没有抖动。我确实需要支持CENTOS(Linux),所以我的问题就在这里。
这是代码片段。
public class AppMain
{
public Shell shell;
public Display display;
public ControlListener oShellControlListener;
public Boolean isResizing = false;
protected void createContents(Display display)
{
shell = new Shell(SWT.SHELL_TRIM);
shell.setMinimumSize(new Point(660, 690));
oShellControlListener = new ControlAdapter()
{
@Override
public void controlResized(ControlEvent arg0)
{
oAppEvents.eventAppResized();
}
};
shell.addControlListener(oShellControlListener);
}
protected void eventAppResized()
{
// Do not allow multiple events.
if (true == this.isResizing)
return;
else
{
this.isResizing = true;
this.shell.removeControlListener(this.oShellControlListener);
}
// Get the new dimensions and the application minimum size (gives x/y ratio).
Point sizApp = this.shell.getSize();
Point sizAppMin = this.shell.getMinimumSize();
// Make sure the user sizes the application while maintaining the same initial X/Y ratio. Y is limiting factor.
int cxAppNew = (int)((double)sizApp.y * ((double)sizAppMin.x / (double)sizAppMin.y));
if (sizApp.x != cxAppNew)
{
sizApp.x = cxAppNew;
this.shell.setSize(sizApp);
}
// Allow another resize event.
this.shell.addControlListener(this.oShellControlListener);
this.isResizing = false;
}
}
以下是一些链接。我之前没有放置链接的原因是我使用推荐的解决方案,即使用静态变量来防止返回resize事件并在调整大小时删除控件侦听器。是的,这两种方法相互重复,所以一个或另一个,但不是两个。当我开始工作时,我会把事情搞清楚。
还有其他文章,但我已经关闭了我的浏览器,再也找不到了。解决方案是我写的:1)变量2)removeControlListener()