1

我想创建自定义标题栏,所以我必须编写允许用户调整大小和移动外壳的代码(我正在使用 SWT),但我遇到了问题

a) 捕获鼠标

b) 调整大小

    shell.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseDown(final MouseEvent arg0) {
            move=true;
            oldx=arg0.x;
            oldy=arg0.y;
            Display.getDefault().syncExec(new Runnable() {
                @Override
                public void run() {
                    while (move) {
                            shell.setLocation(MouseInfo.getPointerInfo().getLocation().x-oldx, MouseInfo.getPointerInfo().getLocation().y-oldy);
                    }
                }

            });
        }
        @Override
        public void mouseUp(MouseEvent arg0) {
            move=false;
        }
    });

移动外壳正在工作,但它不捕获鼠标向上事件。我也不知道如何调整大小。我试过了

shell.setSize(MouseInfo.getPointerInfo().getLocation().x-shell.getBounds().x, MouseInfo.getPointerInfo().getLocation().y-shell.getBounds().y);

但它不起作用。

4

2 回答 2

1

我认为您的问题是移动外壳的 while 循环在 UI 线程中同步运行。这将锁定 UI 并阻止任何其他事件(包括鼠标向上)注册。

尝试将您的移动线程作为单独的后台线程运行,以允许mouseDown调用返回并且仅将调用包装shell.setLocationDisplay.getDefault().syncExec.

于 2012-11-06T16:42:34.530 回答
1

您的问题是您期望事件 #2 (mouseDown) 在事件 #1 (mouseUp) 完成触发之前触发。SWT 一次处理一个事件。您需要启动 #2 以完成 #1 中的操作,这永远不会发生,因为 #2 不会运行。这是一个僵局的情况。您需要在鼠标移动时移动窗口,而不是基于 mouseDown 事件。看看这个例子

于 2012-11-06T16:48:10.893 回答