1

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

shell = new Shell( Display.getDefault(), SWT.RESIZE);        

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

如果我添加SWT.CASCADEor SWT.CLOSE,这会给我标题栏和关闭按钮,这是我不想要的,但此外,它限制了窗口可以调整的大小,即我不能水平调整它的大小超过某个限制。

如何在没有关闭按钮/标题栏的情况下使窗口可移动?如果 SWT 中没有本地方法可以做到这一点,我可以通过监听鼠标拖动事件并手动设置 shell 的位置来做到这一点吗?如果是这样,我将如何从鼠标的移动中获取鼠标坐标?

帮助将不胜感激。谢谢!

4

2 回答 2

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();
    }

}
于 2013-09-23T08:19:45.787 回答
3

这是我的实现:

/**
 * 允许用户移动没有标题的外壳的类。
 *
 * @作者劳伦特穆勒
 * @版本 1.0
 */
公共类 MoveShellListener 实现监听器 {

    /*
     * 父壳
     */
    私人最终壳牌父母;

    /*
     * 鼠标向下位置
     */
    私人点ptMouseDown;

    /**
     * 创建这个类的一个新实例。
     *
     * @param 父级
     * 要处理的外壳。
     */
    公共MoveShellListener(最终壳父){
        如果(父母==空){
            SWT.error(SWT.ERROR_NULL_ARGUMENT);
        }
        if (parent.isDisposed()) {
            SWT.error(SWT.ERROR_WIDGET_DISPOSED);
        }

        // 复制并添加监听器
        this.parent = 父级;
        添加控件(父);
    }

    /**
     * 将给定控件添加到侦听控件列表中。如果给定
     * 控件是 {@link Composite} 的一个实例,子控件是
     * 还添加了。
     *
     * @参数控制
     * 要添加的控件。
     */
    公共无效添加控制(最终控制控制){
        // 检查控制
        if (isDisposed(control) || control.getShell() != parent) {
            返回;
        }

        // 添加监听器
        control.addListener(SWT.MouseDown, this);
        control.addListener(SWT.MouseUp, this);
        control.addListener(SWT.MouseMove, this);

        // 孩子们
        if(复合控制实例){
            final Control[] children = ((Composite) control).getChildren();
            for(最终控制孩子:孩子){
                添加控制(孩子);
            }
        }
    }

    /**
     * 将给定的控件添加到侦听的控件列表中。如果其中之一
     * 给定控件是 {@link Composite} 的一个实例,子控件
     * 也被添加。
     *
     * @param 控件
     * 要添加的控件。
     */
    公共无效addControls(最终控制...控制){
        如果(控制!= null){
            for(最终控制控制:控制){
                添加控制(控制);
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    @覆盖
    公共无效句柄事件(最终事件e){
        开关(e.type){
        案例 SWT.MouseDown:
            onMouseDown(e);
            休息;
        案例 SWT.MouseUp:
            onMouseUp(e);
            休息;
        案例 SWT.MouseMove:
            onMouseMove(e);
            休息;
        }
    }

    /**
     * 将给定的控件删除到侦听的控件列表中。如果给定
     * 控件是 {@link Composite} 的一个实例,子控件是
     * 也被删除。
     *
     * @参数控制
     * 要删除的控件。
     */
    公共无效删除控制(最终控制控制){
        // 检查控制
        if (control == parent || isDisposed(control)
                || control.getShell() != 父级) {
            返回;
        }

        // 移除监听器
        control.removeListener(SWT.MouseDown, this);
        control.removeListener(SWT.MouseUp, this);
        control.removeListener(SWT.MouseMove, this);

        // 孩子们
        if(复合控制实例){
            final Control[] children = ((Composite) control).getChildren();
            for(最终控制孩子:孩子){
                移除控制(孩子);
            }
        }
    }

    /**
     * 将给定的控件删除到侦听的控件列表中。如果其中之一
     * 给定的控件是 {@link Composite} 的一个实例,子元素
     * 控件也被删除。
     *
     * @param 控件
     *要删除的控件。
     */
    公共无效删除控制(最终控制...控制){
        如果(控制!= null){
            for(最终控制控制:控制){
                移除控制(控制);
            }
        }
    }

    /**
     * 检查给定的控件是否已释放null或已释放。
     *
     * @参数控制
     *要验证的控件。
     * @returntrue如果控件是null或
     * 处置。
     */
    私人布尔isDisposed(最终控制控制){
        返回控制 == null || control.isDisposed();
    }

    /**
     * 处理鼠标按下事件。
     *
     * @参数
     * 事件数据。
     */
    私人无效 onMouseDown(最终事件 e){
        如果(e.button == 1){
            ptMouseDown = new Point(ex, ey);
        }
    }

    /**
     * 处理鼠标移动事件。
     *
     * @参数
     * 事件数据。
     */
    私人无效 onMouseMove(最终事件 e){
        如果(ptMouseDown!= null){
            最终点位置 = parent.getLocation();
            location.x += ex - ptMouseDown.x;
            location.y += ey - ptMouseDown.y;
            父.setLocation(位置);
        }
    }

    /**
     * 处理鼠标向上事件。
     *
     * @参数
     * 事件数据。
     */
    私人无效 onMouseUp(最终事件 e){
        ptMouseDown = null;
    }
}
于 2014-11-20T08:13:06.653 回答