Положение формы не будет перерисовываться при перетаскивании мышью

У меня есть заполненный круг, нарисованный на холсте, и я пытаюсь заставить его двигаться на основе метода щелчка и перетаскивания с помощью мыши. Мне удалось проверить, находится ли указатель мыши в пределах круга, и когда я перетаскиваю мышь, переменная, хранящая положение круга, обновляется, как и должна, но сам круг не перерисовывается, когда я перетаскиваю (максимум это будет мерцать). Моя проблема в конце, где я переопределяю mouseDragged().

getCanvas().addMouseListener(new MouseAdapter()
    {   
        @Override
        public void mouseClicked(MouseEvent event)
        {
            super.mouseClicked(event);
            Point mousePosition = event.getPoint();

            if (_circle.getShape1().contains(mousePosition))
                Main.debugLabel.setText("Clicked"); 
        }

        @Override
        public void mouseReleased(MouseEvent event)
        {
            super.mouseReleased(event);

            _circle.isDraggable = false;
            Main.debugLabel.setText("Released");
        }

        @Override
        public void mousePressed(MouseEvent event)
        {
            super.mousePressed(event);

            int button = event.getModifiers();

            if (button == InputEvent.BUTTON1_MASK)
            {
                _circle.isDraggable = true;
                Main.debugLabel.setText("Pressed");
            }
        }       
    });


    getCanvas().addMouseMotionListener(new MouseAdapter()
    {
        @Override
        public void mouseDragged(MouseEvent event)
        {
            super.mouseDragged(event);
            Point mousePosition = event.getPoint();
            if (_circle.isDraggable)
            {   
                _circle.posX = mousePosition.x;
                _circle.posY = mousePosition.y;

                Main.debugLabel.setText("Dragging " + _circle.posX);
                getCanvas().repaint();
            }   
        }
        @Override
        public void mouseMoved(MouseEvent event)
        {
            super.mouseMoved(event);

            Point mousePosition = event.getPoint();
            if (_circle.getShape1().contains(mousePosition))
                    Main.debugLabel.setText("Within Bounds");

            else if (!_circle.getShape1().contains(mousePosition) && !_circle.isDraggable)
                Main.debugLabel.setText("Out of Bounds");   
        }
    });

person Community    schedule 14.11.2013    source источник
comment
@AndrewThompson SO не требует SSCCE (вероятно, потому, что проекты других пользователей различаются по размеру и сложности, чтобы воспроизвести проблему для других, чтобы проверить себя).   -  person    schedule 14.11.2013
comment
@SpicyWeenie, пока проблема не будет решена, вы не знаете, какая часть кода вызывает проблему. Если вы не хотите показать, что приложили усилия для решения своей проблемы, создав SSCCE, то большинство из нас не хотят тратить время на догадки, что вы делаете неправильно.   -  person camickr    schedule 14.11.2013
comment
@camickr Я понимаю, о чем вы говорите, но я также не публикую всю свою программу по одной проблеме. Также совершенно несправедливо предполагать, что я не исследовал себя. Наконец, SSCCE не является обязательным требованием, и если это проблема, которая поставила меня в тупик, я публикую только соответствующий код, в котором произошла ошибка, и любой другой соответствующий код, который показывает, что я пытался предпринять некоторые шаги для ее достижения. Если вам нужно угадать, то извините, но вопрос может быть не совсем для вас, потому что часть программирования заключается в том, чтобы делать обоснованные предположения, будь то с помощью концептуальной теории или программно.   -  person    schedule 14.11.2013
comment
Никто не спрашивал у вас всю вашу программу. В этом весь смысл SSCCE — изолировать ошибку и публиковать только соответствующий код, демонстрирующий проблему. Это часть решения основных проблем. В большинстве случаев, когда вы делаете это, вы сами обнаружите проблему. Ваша задача состоит в том, чтобы сделать вопрос как можно более простым, чтобы он помог вам.   -  person camickr    schedule 15.11.2013
comment
@camickr Тогда, согласно вашему собственному заявлению, я уже изолировал проблему в рамках приведенного выше кода, поскольку я заявил, что значения (x и y) обновляются при перетаскивании, но круг графически не движется. Но один джентльмен уже помог мне решить проблему, заключавшуюся в том, что я не рассчитывал предыдущую позицию мыши и не смещал круг на основе движения мыши. Если вы не знаете ответа или никогда не работали в этой области программирования, просто оставьте вопрос/проблему для кого-то другого, кто может это понять. Давайте согласимся не согласиться.   -  person    schedule 15.11.2013
comment
Таким образом, вы говорите, что вам НЕ следует максимально упрощать людям ответы на ваши вопросы. Опять же, пока не будет дан фактический ответ, вы не знаете, какая информация ему нужна. Вам повезло на этот раз. Пока вы на самом деле не потратите время на ответы на некоторые вопросы, у вас не будет такой точки зрения, как у тех, кто делал это какое-то время. Я бы не стал тратить время на ответы на вопросы, если бы у меня не было опыта в этом вопросе. Мои предложения предназначены для того, чтобы оказать вам максимально возможную помощь.   -  person camickr    schedule 15.11.2013
comment
@camickr Спасибо за ваше мнение.   -  person    schedule 15.11.2013


Ответы (1)


Как показано в этом примере, один из подходов заключается в поддержке двух Point экземпляров. Один содержит последнее местоположение мыши; другой удерживает желаемое целевое местоположение; оба находятся в координатах относительно компонентов.

In mousePressed(),

  • Инициализировать последнее местоположение мыши.

  • При необходимости отметьте цель как выбранную.

  • Вызовите repaint(), чтобы отобразить выбранный внешний вид.

In mouseDragged(),

  • Обновите целевое местоположение по разнице между новым и старым местоположениями мыши.

  • Обновите последнее местоположение мыши до текущего местоположения мыши.

  • Вызвать repaint().

person trashgod    schedule 14.11.2013