在 java swing 中,如何在 jscrollbar 拖动期间获得光标位置?
How do you get the cursor position during a jscrollbar drag in java swing?
我有一个连接到垂直 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() 函数。
我还有 mouseDragged 和 mouseMoved 函数作为主要 class 的一部分,用于当光标位于 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/Whosebug/getX_on_scrollbar_drag_question.mov
有谁知道如何在拖动垂直滚动条时获取光标位置?
private void labelMousePressed(java.awt.event.MouseEvent evt) {
xMouse = evt.getX();
yMouse = evt.getY();
}
通过这段代码,您可以获取在标签上按下时光标的位置。
希望对你有所帮助。
mouseDragged 和 mouseMoved(附加到 jscrollbar)在 jscrollbar 拖动期间不会被调用,并且 AdjustmentEvent 对象无法获取光标位置或访问可以 return 它的对象。因此,您必须使用 MouseInfo.getPointerInfo().getLocation()(请参阅 Get Mouse Position)之类的东西在外部找到光标位置。
然后,要将该坐标转换为相对于 jPanel 的坐标,您可以使用 SwingUtilities.convertPointFromScreen()。
在这里,我在一个覆盖的 updateBuffer 函数中更新了光标位置,然后调用它的父级来绘制所有内容。请注意,我只在拖动滚动条时更新悬停位置(例如 areLabelsBeingScrolled()),它只是 returns 一个布尔值,当鼠标单击滚动条时设置为 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/Whosebug/getX_on_scrollbar_drag_answer.mov
此外,为了使光标悬停变化平滑,我使用了一个计时器,使updateBuffer在滚动期间不断更新。但那是问题的附属内容,所以我不会详细介绍它。
我有一个连接到垂直 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() 函数。
我还有 mouseDragged 和 mouseMoved 函数作为主要 class 的一部分,用于当光标位于 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/Whosebug/getX_on_scrollbar_drag_question.mov
有谁知道如何在拖动垂直滚动条时获取光标位置?
private void labelMousePressed(java.awt.event.MouseEvent evt) {
xMouse = evt.getX();
yMouse = evt.getY();
}
通过这段代码,您可以获取在标签上按下时光标的位置。
希望对你有所帮助。
mouseDragged 和 mouseMoved(附加到 jscrollbar)在 jscrollbar 拖动期间不会被调用,并且 AdjustmentEvent 对象无法获取光标位置或访问可以 return 它的对象。因此,您必须使用 MouseInfo.getPointerInfo().getLocation()(请参阅 Get Mouse Position)之类的东西在外部找到光标位置。
然后,要将该坐标转换为相对于 jPanel 的坐标,您可以使用 SwingUtilities.convertPointFromScreen()。
在这里,我在一个覆盖的 updateBuffer 函数中更新了光标位置,然后调用它的父级来绘制所有内容。请注意,我只在拖动滚动条时更新悬停位置(例如 areLabelsBeingScrolled()),它只是 returns 一个布尔值,当鼠标单击滚动条时设置为 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/Whosebug/getX_on_scrollbar_drag_answer.mov
此外,为了使光标悬停变化平滑,我使用了一个计时器,使updateBuffer在滚动期间不断更新。但那是问题的附属内容,所以我不会详细介绍它。