如何创建一个没有标题栏/关闭按钮的可移动SWT shell?

use*_*209 1 java swt

如果我使用以下代码创建一个新shell:

shell = new Shell( Display.getDefault(), SWT.RESIZE);        
Run Code Online (Sandbox Code Playgroud)

然后这给了我一个没有标题栏或最小化/最大化按钮的shell,这就是我想要的.我可以将这个窗口调整到任何大小,这很好.但问题是,窗口固定在它的位置,我不能通过拖动它来移动它.

如果我添加SWT.CASCADE或者SWT.CLOSE,这给了我标题栏和关闭按钮,这是我不想要的,但是,它限制了窗口可以调整大小的程度,即我不能水平调整它的大小.限制.

如何在没有关闭按钮/标题栏的情况下使窗口可以移动?如果在SWT中没有本地方式来执行此操作,我可以通过侦听鼠标拖动事件并手动设置shell的位置来实现吗?如果是这样,我如何从鼠标的移动中获得鼠标坐标?

帮助将不胜感激.谢谢!

小智 5

你需要使用自己的听众.下面的代码应该有帮助: -

public class Demo {

    static Boolean blnMouseDown=false;
    static int xPos=0;
    static int yPos=0;

    public static void main(final String[] args) {
        Display display=new Display();
        final Shell shell = new Shell( Display.getDefault(), SWT.RESIZE); 
        shell.open();

        shell.addMouseListener(new MouseListener() {

            @Override
            public void mouseUp(MouseEvent arg0) {
                // TODO Auto-generated method stub
                blnMouseDown=false;
            }

            @Override
            public void mouseDown(MouseEvent e) {
                // TODO Auto-generated method stub
                blnMouseDown=true;
                xPos=e.x;
                yPos=e.y;
            }

            @Override
            public void mouseDoubleClick(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }
        });
        shell.addMouseMoveListener(new MouseMoveListener() {

            @Override
            public void mouseMove(MouseEvent e) {
                // TODO Auto-generated method stub
                if(blnMouseDown){

                    shell.setLocation(shell.getLocation().x+(e.x-xPos),shell.getLocation().y+(e.y-yPos));
                }
            }
        });

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

}
Run Code Online (Sandbox Code Playgroud)