我想创建自定义标题栏,所以我必须编写允许用户调整大小并移动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);
但它不起作用。
答案 0 :(得分:1)
我认为你的问题是移动shell的while循环在UI线程中同步运行。这将锁定UI并防止任何其他事件(包括鼠标向上)注册。
尝试将移动线程作为单独的后台线程运行,以允许mouseDown
调用返回,并仅将调用包裹在shell.setLocation
中的Display.getDefault().syncExec
。
答案 1 :(得分:1)
您的问题是,在事件#1(mouseUp)完成触发之前,您希望触发事件#2(mouseDown)。 SWT一次处理一个事件。您需要#2才能在#1中完成操作,这将永远不会发生,因为#2将无法运行。这是一个僵局。您需要在鼠标移动时移动窗口,而不是基于mouseDown事件。看看这个example。