在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()函数
我也有mouseDragged和mouseMoved函数作为主类的一部分,当光标位于jPanel上时。它们用于控制水平位置和进行选择。这两项工作都非常出色:
@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
有人知道如何在拖动垂直滚动条时获得光标位置吗
# 1 楼答案
在jscrollbar拖动期间,不会调用mouseDragged和mouseMoved(附加到jscrollbar),AdjustmentEvent对象无法获取光标位置,也无法访问可以返回光标的对象。因此,必须使用MouseInfo之类的工具在外部找到光标位置。getPointerInfo()。getLocation()(参见Get Mouse Position)
然后,要将该坐标转换为相对于jPanel的坐标,可以使用SwingUtilities。convertPointFromScreen()
在这里,我更新了被重写的updateBuffer函数中的光标位置,然后调用其父函数来绘制所有内容。请注意,我只在拖动滚动条时更新悬停位置(例如arelabelsbeingcrolled()),它只会返回一个布尔值,当鼠标单击滚动条时,该布尔值设置为true,释放滚动条时,该布尔值设置为false
正如您从这个屏幕录制中看到的,它运行得非常好:
https://dl.dropboxusercontent.com/u/87939936/StackOverflow/getX_on_scrollbar_drag_answer.mov
此外,为了使光标悬停的变化平滑,我使用了一个计时器,使updateBuffer在滚动期间不断更新。但这是这个问题的附属问题,所以我不会进一步详细讨论它