【问题标题】:Java SWT: How to set the window to be resizable \ not resizable on the fly?Java SWT:如何将窗口设置为可调整大小\不可即时调整大小?
【发布时间】:2013-11-21 09:48:51
【问题描述】:

经过大量搜索和研究,我找不到任何答案。 我会非常感谢能帮助我的人。

在 SWT java 中, 我希望我的窗口不能调整大小,所以我这样定义它:

shell = new Shell(SWT.CLOSE | SWT.TITLE | SWT.MIN);

但是我想将其更改为可调整大小(例如,在我单击按钮后)。 如何动态更改 shell 的样式?

【问题讨论】:

  • AFAIK,Shell 创建后无法更改样式。不幸的是,我无法提供替代方案。期待这个问题的答案。

标签: java shell resize window swt


【解决方案1】:

如果您专门为 Windows 开发,您可以使用非纯 SWT 代码(不可移植)来实现这一点。没有明显的故障,重新育儿控制没有问题(例如,参见this bug)。只有 resizable 属性被改变。这是sn-p:

public static void main(String[] args) {
    final Display display = new Display();
    Shell shell = new Shell(display);

    final int style = OS.GetWindowLong(shell.handle, OS.GWL_STYLE);
    OS.SetWindowLong(shell.handle, OS.GWL_STYLE, style & ~0x00040000);

    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    display.dispose();
}

WS_SIZEBOX = 0x00040000L

编辑: 使用简单的函数:

private static final int WS_SIZEBOX = 0x00040000;

public static void setResizable(Shell shell, boolean resizable) {
    final int style = OS.GetWindowLong(shell.handle, OS.GWL_STYLE);
    final int newStyle = resizable ? style | WS_SIZEBOX : style & ~WS_SIZEBOX;
    OS.SetWindowLong(shell.handle, OS.GWL_STYLE, newStyle);
}

public static boolean isResizable(Shell shell) {
    final int style = OS.GetWindowLong(shell.handle, OS.GWL_STYLE);
    return (style & WS_SIZEBOX) != 0;
}

【讨论】:

    【解决方案2】:

    Shell 的样式一旦创建就无法更改,因此您无法直接执行此操作。

    您可以做的是创建一个具有所需样式的新Shell(及其所有内容),并将其边界设置为与旧Shell 相同,然后关闭旧shell。当 Eclipse 想要将工具提示窗口转换为普通窗口时,它会这样做。

    【讨论】:

    • 好的,谢谢,我试过了,并设法得到了接近我想要的东西。但我不喜欢它的效果——似乎一扇窗户关闭了,另一扇窗户打开了。此外,我需要再次将所有小部件分配给新外壳。很高兴知道此选项存在,但我更喜欢手动限制可调整性(通过捕获窗口控制事件并将窗口调整为默认尺寸)。无论如何,非常感谢。
    • 为新的 shell 指定 SWT.ON_TOP 有助于使更改更加无缝,但是如果有很多控件会很混乱。
    猜你喜欢
    • 1970-01-01
    • 2015-01-28
    • 2011-12-06
    • 2019-05-15
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多