【问题标题】:Shape position wont redraw when dragged with mouse用鼠标拖动时形状位置不会重绘
【发布时间】:2013-11-14 18:01:28
【问题描述】:

我在画布上绘制了一个实心圆圈,我试图让它基于鼠标的单击和拖动方法移动。我已经设法检查鼠标指针是否在圆圈的范围内,当我拖动鼠标时,存储圆圈位置的变量会按应有的方式更新,但圆圈本身并没有在我拖动时重绘(它会做的最多的是闪烁)。我的问题是最后我要覆盖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");   
        }
    });

【问题讨论】:

  • @AndrewThompson SO 不需要 SSCCE(可能是因为其他用户的项目在规模和复杂性上各不相同,以复制问题供其他人测试自己)。
  • @SpicyWeenie,在解决问题之前,您不知道代码的哪一部分导致了问题。如果您不愿意通过创建 SSCCE 来表明您已努力解决您的问题,那么我们大多数人都不愿意浪费时间猜测您可能做错了什么。
  • @camickr 我明白你在说什么,但我也不会针对一个问题发布我的整个程序。假设我没有自己研究也是很不公平的。最后,SSCCE 不是必需的,如果这是一个困扰我的问题,我只发布发生错误的相关代码以及任何其他表明我已尝试采取一些步骤来达到的相关代码。如果您必须猜测,那么抱歉,但这个问题可能并不适合您,因为编程的一部分是通过概念理论或编程方式进行有根据的猜测。
  • 没有人要求您提供整个程序。这是 SSCCE 的全部要点,即隔离错误并仅发布演示问题的相关代码。这是基本问题解决的一部分。大多数时候,当你这样做时,你会自己发现问题。你的工作就是让问题尽可能简单以帮助你。
  • @camickr 然后根据您自己的说法,我已经将问题隔离到上述代码中,因为我已经说明值(x 和 y)在拖动时会更新,但圆圈以图形方式显示不动。但是一位绅士已经帮助我解决了我没有计算先前的鼠标位置并根据鼠标移动偏移圆的问题。如果您不知道答案或从未真正在该编程领域工作过,请将问题/问题留给可能理解它的其他人。让我们同意不同意。

标签: java swing mouseevent shape mousemove


【解决方案1】:

example 所示,一种方法是维护两个 Point 实例。一个持有最后一个鼠标位置;另一个持有所需的目标位置;两者都在组件相对坐标中。

mousePressed()

  • 初始化最后一个鼠标位置。

  • (可选)将目标标记为选中。

  • 调用repaint() 以显示选定的外观。

mouseDragged()

  • 通过新旧鼠标位置之间的差异更新目标位置。

  • 将上次鼠标位置更新为当前鼠标位置。

  • 调用repaint()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多