有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java拖动JPanel

我在尝试拖动JPanel时遇到问题。如果我纯粹在MouseDragged中实现它,则如下所示:

public void mouseDragged(MouseEvent me) {
   me.getSource().setLocation(me.getX(), me.getY());
}

我得到一个奇怪的效果,移动的对象一直在两个位置之间反弹(生成更多的“拖动”事件)。如果我按照this post中描述的方式进行操作,但是:

public void mouseDragged(MouseEvent me) {
   if (draggedElement == null)
      return;

   me.translatePoint(this.draggedXAdjust, this.draggedYAdjust);
   draggedElement.setLocation(me.getX(), me.getY());
}

我得到的元素弹跳效果要小得多,但它仍然可见,并且元素的移动方式仅为鼠标指针的½。为什么会发生这种情况/我如何解决这种情况


共 (3) 个答案

  1. # 1 楼答案

    嗯。老问题,但如果有人遇到像我这样的问题,这可以相对简单地解决。在JFrame中拖动JPanel时,我执行了以下操作:

        @Override
        public void mousePressed(MouseEvent e) {
            if (panel.contains(e.getPoint())) {
                dX = e.getLocationOnScreen().x - panel.getX();
                dY = e.getLocationOnScreen().y - panel.getY();
                panel.setDraggable(true);
            }
        }
    
        @Override
        public void mouseDragged(MouseEvent e) {
            if (panel.isDraggable()) {
                panel.setLocation(e.getLocationOnScreen().x - dX, e.getLocationOnScreen().y - dY);
                dX = e.getLocationOnScreen().x - panel.getX();
                dY = e.getLocationOnScreen().y - panel.getY();
            }
        }
    

    关键是使用.getLocationOnScreen()并在每次调用mouseDragged结束时更新调整

  2. # 2 楼答案

    我不知道你是否可以用鼠标标记的事件来完成。在过去,我使用mousePressed保存原始点,并拖动鼠标以获取当前点。在这两种情况下,我将点转换到屏幕上的位置。然后,两个点之间的差异很容易计算,并且可以适当地设置位置

    我的通用类是Component Mover

  3. # 3 楼答案

    试试这个

    final Component t = e.getComponent();
        e.translatePoint(getLocation().x + t.getLocation().x - px, getLocation().y + t.getLocation().y - py);
    

    并添加此方法:

    @Override
    public void mousePressed(final MouseEvent e) {
        e.translatePoint(e.getComponent().getLocation().x, e.getComponent().getLocation().y);
        px = e.getX();
        py = e.getY();
    }