Позицията на фигурата няма да се преначертае при плъзгане с мишката

Имам запълнен кръг, начертан върху платно и се опитвам да го накарам да се движи въз основа на метода на кликване и плъзгане с мишката. Успях да проверя дали показалецът на мишката е в границите на кръга и когато плъзгам мишката, променливата, съхраняваща позицията на кръга, се актуализира както трябва, но самият кръг не се преначертава, докато плъзгам (най-многото, което ще направи, е трептене). Проблемът ми е в края, където замествам 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