簡體   English   中英

在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()函數。

當光標位於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM