【问题标题】:How do you get the cursor position during a jscrollbar drag in java swing?java - 如何在java swing中的jscrollbar拖动期间获取光标位置?
【发布时间】:2015-10-18 06:12:17
【问题描述】:

我有一个连接到垂直 jScrollbar 的鼠标侦听器。内容的水平方面由悬停位置控制。现在,当用户拖动垂直滚动条手柄时,内容垂直滚动就好了,但他们只能看到最右边的内容(水平而言),因为光标不在 jPanel 的右侧。

我想做的是,一旦用户点击拖动垂直滚动条,我想让他们将光标悬停在内容上(当鼠标按钮按下时)并更新内容的水平位置.

然而,即使我已经向我的 jscrollbar 的鼠标侦听器添加了一个覆盖的 mouseDragged 函数来更新手动维护的悬停位置,它也不会被触发。这是我的代码:

getSecondaryScrollBar().addMouseListener(new MouseAdapter() {
    ...
    @Override
    public void mouseDragged(final MouseEvent e) {
        debug("Hover pixel position during drag: [" + e.getX() + "]",8);
        if(e.getX() < 0) {
            //Set the hover position to wherever the cursor has wandered to while dragging the secondary scrollbar
            map.setHoverIndex(map.getIndex(scrollPane.getViewport().getSize().width + e.getX()));
        } else {
            //Set the hover position as the far right label
            map.setHoverIndex(-1);
        }
        repaint();
    }
});

在拖动滚动条时不会打印调试消息。标签垂直滚动。我什至通过添加断点进行调试,所以我知道 mouseDragged 甚至没有被调用。我也尝试了 mouseMoved 函数,结果相同。

我有一个调整监听器,它接受一个调整事件对象来处理内容的垂直拖动,但它无法访问鼠标事件 getX() 函数。

当光标在 jPanel 上时,我也有 mouseDragged 和 mouseMoved 函数作为主类的一部分。它们用于控制水平位置和进行选择。两者都出色地工作:

@Override
public void mouseMoved(final MouseEvent e) {
    setHoverPosition(e);
    hoverIndex = map.getIndex(getPrimaryHoverPosition(e));
    repaint();
}
@Override
public void mouseDragged(final MouseEvent e) {
    setHoverPosition(e);
    hoverIndex = map.getIndex(getPrimaryHoverPosition(e));
    map.setHoverIndex(hoverIndex);
    debug("Selecting from " + map.getSelectingStart() + " to " + map.getIndex(getPrimaryHoverPosition(e)),8);
    repaint();
}

最后,这是一个屏幕记录,可以说明我在做什么,以防我的描述不充分:

https://dl.dropboxusercontent.com/u/87939936/StackOverflow/getX_on_scrollbar_drag_question.mov

有谁知道如何在垂直滚动条的拖动过程中获取光标位置?

【问题讨论】:

  • 我怀疑你可以用 JScrollBar 做你想做的事(对于垂直滚动条,如果鼠标在滚动条的左边或右边很远,滚动条会弹回到它的起始位置);您需要的是一个可以同时滚动两个方向(上/下和左/右)的平移器。不幸的是,swing 没有这样的控制。
  • 其实我有一个很大的屏幕,当我装上滚动条并将鼠标悬停到屏幕的另一端时,我仍然可以上下拖动它。悬停似乎不会导致它弹回其起始位置,所以如果这是您认为使用 jscrollbar 不可能实现的唯一原因,还有其他原因是不可能的吗?

标签: java swing hover cursor-position jscrollbar


【解决方案1】:
private void labelMousePressed(java.awt.event.MouseEvent evt) {                                    
    xMouse = evt.getX();
    yMouse = evt.getY();
} 

通过此代码,您可以获取光标在标签上按下时的位置。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    在 jscrollbar 拖动期间不会调用mouseDragged 和 mouseMoved(附加到 jscrollbar),并且 AdjustmentEvent 对象无法获取光标位置或访问可以返回它的对象。因此,您必须使用诸如 MouseInfo.getPointerInfo().getLocation() 之类的东西在外部找到光标位置(请参阅Get Mouse Position)。

    然后,要将坐标转换为相对于 jPanel,您可以使用 SwingUtilities.convertPointFromScreen()。

    在这里,我在一个被覆盖的 updateBuffer 函数中更新了光标位置,然后调用其父函数来绘制所有内容。请注意,我只在拖动滚动条时更新悬停位置(例如 areLabelsBeingScrolled()),它只返回一个布尔值,当鼠标单击滚动条时设置为 true,释放时设置为 false。

    @Override
    public void updateBuffer(final Graphics g,final Dimension offscreenSize) {
        if(areLabelsBeingScrolled()) {
            Point p = MouseInfo.getPointerInfo().getLocation();
            SwingUtilities.convertPointFromScreen(p,getComponent());
            debug("Cursor x coordinate relative to column labels: [" + p.x + "]",8);
            int hDI = map.getIndex(p.x); //Hover Data Index
            if(hDI > map.getMaxIndex()) {
                hDI = map.getMaxIndex();
            } else if (hDI < 0) {
                hDI = 0;
            }
            map.setHoverIndex(hDI);
        }
        super.updateBuffer(g,offscreenSize);
    }
    

    从这个屏幕录像可以看出,它运行良好:

    https://dl.dropboxusercontent.com/u/87939936/StackOverflow/getX_on_scrollbar_drag_answer.mov

    此外,为了使光标悬停变化平滑,我使用了一个计时器,它使 updateBuffer 在滚动期间不断更新。但这只是问题的附属,所以我不会对此进行进一步的详细说明。

    【讨论】:

      猜你喜欢
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2012-09-06
      相关资源
      最近更新 更多