在SWT UI中删除窗口边框会禁用重新定位

时间:2014-04-17 06:44:20

标签: java user-interface window swt borderless

有没有办法删除SWT Shell边框并支持窗口重新定位。我在我的Shell样式中使用了SWT.NONE来删除窗口边框,但最终也锁定了UI位置。

1 个答案:

答案 0 :(得分:2)

是的,你可以,但你必须自己处理拖动事件。这是一个例子:

public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP);

    Listener l = new Listener()
    {
        Point origin;

        public void handleEvent(Event e)
        {
            switch (e.type)
            {
                case SWT.MouseDown:
                    origin = new Point(e.x, e.y);
                    break;
                case SWT.MouseUp:
                    origin = null;
                    break;
                case SWT.MouseMove:
                    if (origin != null)
                    {
                        Point p = display.map(shell, null, e.x, e.y);
                        shell.setLocation(p.x - origin.x, p.y - origin.y);
                    }
                    break;
            }
        }
    };
    shell.addListener(SWT.MouseDown, l);
    shell.addListener(SWT.MouseUp, l);
    shell.addListener(SWT.MouseMove, l);

    shell.setSize(400, 300);
    shell.open();

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

发布屏幕截图并不值得,因为它只是一个可拖动的灰色窗口。

<强>更新

如果你希望整个Shell可以拖动,即使它包含其他小部件,那么请改用它:

    display.addFilter(SWT.MouseDown, l);
    display.addFilter(SWT.MouseUp, l);
    display.addFilter(SWT.MouseMove, l);