代码之家  ›  专栏  ›  技术社区  ›  viraptor

拖动jpanel

  •  2
  • viraptor  · 技术社区  · 14 年前

    我在拖动jpanel时遇到问题。如果我完全用鼠标抹布来实现它:

    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 回复  |  直到 12 年前
        1
  •  1
  •   Skip Head    14 年前

    试试这个

    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();
    }
    
        2
  •  4
  •   Ben    12 年前

    好啊。老问题,但如果有人像我一样遇到这个问题,这个问题可以相对简单地解决。用于拖动 JPanel 在一个 JFrame 我做到了:

        @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 .

        3
  •  1
  •   camickr    14 年前

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

    我的通用课程是 Component Mover 班级。