在java swing中,如何在jscrollbar拖动过程中获得光标位置



我有一个鼠标侦听器连接到一个垂直的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();
    }
});

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

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

当光标位于jPanel上时,我还将mouseDraged和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

有人知道在拖动垂直滚动条时如何获取光标位置吗?

mouseDragged和mouseMoved(附加到jscrollbar(在jscrollbar拖动期间不会被调用,AdjustmentEvent对象无法获得光标位置或访问可以返回光标的对象。因此,您必须使用类似MouseInfo.getPointerInfo((.getLocation((的东西在外部查找光标位置(请参见获取鼠标位置(。

然后,要将该坐标转换为相对于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在滚动期间不断更新。但这是这个问题的辅助,所以我不会再详细介绍了。

private void labelMousePressed(java.awt.event.MouseEvent evt) {                                    
    xMouse = evt.getX();
    yMouse = evt.getY();
} 

从这个代码中,您可以获得光标在标签上按下时的位置。

我希望这对你有帮助。

相关内容

  • 没有找到相关文章