【问题标题】:How to create a moveable SWT shell without title bar/ close button?如何创建没有标题栏/关闭按钮的可移动 SWT 外壳?
【发布时间】:2013-09-22 21:44:22
【问题描述】:

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

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

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

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

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

我们将不胜感激。谢谢!

【问题讨论】:

    标签: java swt


    【解决方案1】:

    您需要使用自己的侦听器。下面的代码应该会有所帮助:-

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

    【讨论】:

    【解决方案2】:

    这是我的实现:

    /** * 允许用户移动没有标题的外壳的类。 * * @作者劳伦特穆勒 * @版本 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 或已处置。 * * @参数控制 *要验证的控件。 * @return true 如果控件是 null 或 * 处置。 */ 私人布尔isDisposed(最终控制控制){ 返回控制 == null || control.isDisposed(); } /** * 处理鼠标按下事件。 * * @参数 * 事件数据。 */ 私人无效 onMouseDown(最终事件 e){ 如果(e.button == 1){ ptMouseDown = new Point(e.x, e.y); } } /** * 处理鼠标移动事件。 * * @参数 * 事件数据。 */ 私人无效 onMouseMove(最终事件 e){ 如果(ptMouseDown!= null){ 最终点位置 = parent.getLocation(); location.x += e.x - ptMouseDown.x; location.y += e.y - ptMouseDown.y; 父.setLocation(位置); } } /** * 处理鼠标向上事件。 * * @参数 * 事件数据。 */ 私人无效 onMouseUp(最终事件 e){ ptMouseDown = null; } }

    【讨论】:

      猜你喜欢
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多