当前位置: 代码迷 >> java >> 在Java swing中的jscrollbar拖动过程中,如何获取光标位置?
  详细解决方案

在Java swing中的jscrollbar拖动过程中,如何获取光标位置?

热度:78   发布时间:2023-08-02 11:11:39.0

我在垂直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();
}

最后,这是一个屏幕录像,应该可以澄清我在做的描述不足的情况:

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

在jscrollbar拖动期间,不会调用mouseDragged和mouseMoved(附加到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);
}

从此屏幕录像中可以看到,它运行良好:

此外,为了使光标悬停更改平滑,我使用了一个计时器,该计时器使updateBuffer在滚动期间不断更新。 但这是该问题的辅助条件,因此我将不做进一步的详细介绍。

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

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

我希望这可以帮助你。

  相关解决方案