java - 在java swing中,如何在jscrollbar拖动期间获取光标位置?

标签 java swing hover cursor-position jscrollbar

我有一个连接到垂直 jScrollbar 的鼠标监听器。内容的水平方向由悬停位置控制。现在,当用户拖动垂直滚动条 handle 时,内容可以很好地垂直滚动,但他们只能看到最右边的内容(水平而言),因为光标离开了 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 拖动期间不会调用 mouseDragged 和 mouseMoved(附加到 jscrollbar),并且 AdjustmentEvent 对象无法获取光标位置或访问可返回光标位置的对象。因此,您必须使用 MouseInfo.getPointerInfo().getLocation() 之类的方法从外部找到光标位置(请参阅 Get Mouse Position )。

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

在这里,我在重写的 updateBuffer 函数中更新了光标位置,然后调用其父函数来绘制所有内容。请注意,我仅在拖动滚动条时更新悬停位置(例如 areLabelsBeingScrolled()),它仅返回一个 boolean 值,当鼠标单击滚动条时该 boolean 值设置为 true,而当鼠标单击滚动条时该 boolean 值设置为 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 在滚动期间不断更新。但这是问题的附属部分,因此我不会进一步详细介绍。

关于java - 在java swing中,如何在jscrollbar拖动期间获取光标位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31663594/

相关文章:

java - 椭圆形最上面的五行被删除。为什么?

javascript - 嵌套悬停事件,只适用于最直接悬停的元素

java - Spring 安全 : user and admin login fails

java - Oracle:Java 存储函数:使用数据库

java - 错误: Column 'col_name' not found with createSQLQuery

jquery - 在 img 鼠标悬停时显示 div(jquery)

javascript - 加载悬停图像的数据

java - 使用 lucene 重新索引/从索引中删除术语

java - Java 线程如何与 invokeLater() 同步?

java - JTable 排序在单元格中没有好的值(value)