[英]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()函數。
當光標位於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()之類的東西在外部找到光標位置(請參閱獲取鼠標位置 )。
然后,要將該坐標轉換為相對於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();
}
通過此代碼,您可以將光標在標簽上按下時的位置。
我希望這可以幫助你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.