Java:调整SWT shell大小以保持宽高比的正确方法

时间:2014-05-16 18:29:25

标签: java linux shell resize swt

我确实在这个任务中看到了其他线程。推荐的答案几乎就是我实现的,请参阅下面的代码。代码在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事件并在调整大小时删除控件侦听器。是的,这两种方法相互重复,所以一个或另一个,但不是两个。当我开始工作时,我会把事情搞清楚。

SO 1

SO 2

还有其他文章,但我已经关闭了我的浏览器,再也找不到了。解决方案是我写的:1)变量2)removeControlListener()

0 个答案:

没有答案