Nano Hash - криптовалюты, майнинг, программирование

Как создать подвижную оболочку SWT без строки заголовка/кнопки закрытия?

Если я создам новую оболочку, используя следующий код:

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

Затем это дает мне оболочку без строки заголовка или кнопок свертывания/разворачивания, чего я и хочу. Я могу изменить размер этого окна на любой размер, и это прекрасно работает. Но проблема в том, что окно закреплено на своем месте, и я не могу его сдвинуть, перетаскивая.

Если я добавлю либо SWT.CASCADE, либо SWT.CLOSE, это даст мне строку заголовка и кнопку закрытия, которые мне не нужны, но, кроме того, это накладывает ограничение на то, насколько малым может быть изменение размера окна, т.е. я не могу изменить его размер по горизонтали за пределы определенный предел.

Как я могу сделать окно подвижным без кнопки закрытия/заголовка? Если в SWT нет собственного способа сделать это, могу ли я сделать это, прослушивая событие перетаскивания мышью и вручную устанавливая местоположение оболочки? Если да, то как мне получить координаты мыши от движения мыши?

Помощь приветствуется. Спасибо!

22.09.2013

Ответы:


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

}
23.09.2013
  • Спасибо, я уже реализовал подобное решение, но у меня с ним другая проблема. Есть ли шанс, что вы можете помочь? stackoverflow.com/questions/18952545/ 23.09.2013

  • 2

    Это моя реализация:

    /**
     * Class to allow user to move a shell without a title.
     * 
     * @author Laurent Muller
     * @version 1.0
     */
    public class MoveShellListener implements Listener {
    
        /*
         * the parent shell
         */
        private final Shell parent;
    
        /*
         * the mouse down location
         */
        private Point ptMouseDown;
    
        /**
         * Creates a new instance of this class.
         * 
         * @param parent
         *            the shell to handle.
         */
        public MoveShellListener(final Shell parent) {
            if (parent == null) {
                SWT.error(SWT.ERROR_NULL_ARGUMENT);
            }
            if (parent.isDisposed()) {
                SWT.error(SWT.ERROR_WIDGET_DISPOSED);
            }
    
            // copy and add listener
            this.parent = parent;
            addControl(parent);
        }
    
        /**
         * Adds the given control to the list of listened controls. If the given
         * control is an instance of {@link Composite}, the children controls are
         * also added.
         * 
         * @param control
         *            the control to add.
         */
        public void addControl(final Control control) {
            // check control
            if (isDisposed(control) || control.getShell() != parent) {
                return;
            }
    
            // add listeners
            control.addListener(SWT.MouseDown, this);
            control.addListener(SWT.MouseUp, this);
            control.addListener(SWT.MouseMove, this);
    
            // children
            if (control instanceof Composite) {
                final Control[] children = ((Composite) control).getChildren();
                for (final Control child : children) {
                    addControl(child);
                }
            }
        }
    
        /**
         * Adds the given controls to the list of listened controls. If one of the
         * given controls is an instance of {@link Composite}, the children controls
         * are also added.
         * 
         * @param controls
         *            the controls to add.
         */
        public void addControls(final Control... controls) {
            if (controls != null) {
                for (final Control control : controls) {
                    addControl(control);
                }
            }
        }
    
        /**
         * {@inheritDoc}
         */
        @Override
        public void handleEvent(final Event e) {
            switch (e.type) {
            case SWT.MouseDown:
                onMouseDown(e);
                break;
            case SWT.MouseUp:
                onMouseUp(e);
                break;
            case SWT.MouseMove:
                onMouseMove(e);
                break;
            }
        }
    
        /**
         * Removes the given control to the list of listened controls. If the given
         * control is an instance of {@link Composite}, the children controls are
         * also removed.
         * 
         * @param control
         *            the control to remove.
         */
        public void removeControl(final Control control) {
            // check control
            if (control == parent || isDisposed(control)
                    || control.getShell() != parent) {
                return;
            }
    
            // remove listeners
            control.removeListener(SWT.MouseDown, this);
            control.removeListener(SWT.MouseUp, this);
            control.removeListener(SWT.MouseMove, this);
    
            // children
            if (control instanceof Composite) {
                final Control[] children = ((Composite) control).getChildren();
                for (final Control child : children) {
                    removeControl(child);
                }
            }
        }
    
        /**
         * Removes the given controls to the list of listened controls. If one of
         * the given controls is an instance of {@link Composite}, the children
         * controls are also removed.
         * 
         * @param controls
         *            the controls to remove.
         */
        public void removeControls(final Control... controls) {
            if (controls != null) {
                for (final Control control : controls) {
                    removeControl(control);
                }
            }
        }
    
        /**
         * Checks if the given control is null or disposed.
         * 
         * @param control
         *            the control to verify.
         * @return true if the control is null or
         *         disposed.
         */
        private boolean isDisposed(final Control control) {
            return control == null || control.isDisposed();
        }
    
        /**
         * Handles the mouse down event.
         * 
         * @param e
         *            the event data.
         */
        private void onMouseDown(final Event e) {
            if (e.button == 1) {
                ptMouseDown = new Point(e.x, e.y);
            }
        }
    
        /**
         * Handles the mouse move event.
         * 
         * @param e
         *            the event data.
         */
        private void onMouseMove(final Event e) {
            if (ptMouseDown != null) {
                final Point location = parent.getLocation();
                location.x += e.x - ptMouseDown.x;
                location.y += e.y - ptMouseDown.y;
                parent.setLocation(location);
            }
        }
    
        /**
         * Handles the mouse up event.
         * 
         * @param e
         *            the event data.
         */
        private void onMouseUp(final Event e) {
            ptMouseDown = null;
        }
    }
    
    20.11.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..