使用鼠标移动和调整shell大小(自定义标题栏)

时间:2012-11-06 16:19:23

标签: java titlebar

我想创建自定义标题栏,所以我必须编写允许用户调整大小并移动shell的代码(我使用的是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正在运行,但它不会捕获鼠标注册事件。另外我不知道如何调整大小。我试过了

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

但它不起作用。

2 个答案:

答案 0 :(得分:1)

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

尝试将移动线程作为单独的后台线程运行,以允许mouseDown调用返回,并仅将调用包裹在shell.setLocation中的Display.getDefault().syncExec

答案 1 :(得分:1)

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