2011-08-24 61 views
1

我有一個非常大的數據視圖。我想爲用戶提供一個滾動條,但是我想重寫滾動條按下向上和向下箭頭(或鍵盤上的上下鍵)的標準方式,以及點擊頁面上的軌道區域以及向下翻頁。這是因爲數據流入視圖,而JScrollBar的「最小/最大/值」模型不適用於此。如何防止JScrollBar滾動頁面向下的特定事件?

處理這些鼠標或按鍵事件的標準方式是滾動條的值可以通過「單位增量」(較小的值)或「塊增量」(較大的值)進行調整。 我不希望滾動條在點擊時改變它的值;我只想收到一個事件,說「用戶請求向上滾動塊」或「用戶請求向下滾動一個單元」。有誰知道一種方法來做到這一點?

順便說一句,看起來BasicScrollBarUI$TrackListener.mousePressed(MouseEvent)處理點擊,它總是調用scrollbar.setValue(newValue)。所以,我可能是出於運氣:(

也許有一種方法用SWT滾動條來做到這一點的?

回答

1

我想出如何做到這一點。我給滾動條擴展默認的自定義UI BasicScrollBarUI ,但是會覆蓋我需要的兩種重要方法:scrollByBlock() a nd scrollByUnit()。事實證明,如果需要,我可以在這些方法中調用setValue()而不會搞亂事件。

class MyUI extends BasicScrollBarUI 
{ 
    @Override 
    protected void scrollByBlock(int direction) 
    { 
     System.out.println("scrollByBlock " + direction); 
     // super.scrollByBlock(direction); 
     scrollBar.setValue(scrollBar.getValue() + (direction * 10)); 
    } 

    @Override 
    protected void scrollByUnit(int direction) 
    { 
     System.out.println("scrollByUnit " + direction); 
     // super.scrollByUnit(direction); 
     scrollBar.setValue(scrollBar.getValue() + (direction * 3)); 
    } 
} 
1

Swing組件使用操作來處理鍵盤和鼠標的許多事件。退房Key Bindings對的列表通過滾動條支持的動作。

你應該能夠用自己的自定義操作來替代這些操作。

+0

不幸的是,那些將不會削減它。鼠標事件直接從'Component.processMouseEvent()'調用''BasicScrollBarUI $ TrackListener.mousePressed()',它總是調用'scrollbar.setValue(newValue)'。我不確定這是否有一個乾淨的方法;我可能必須繼承'BasicScrollBarUI'並覆蓋一些方法。這可能不會在不同版本的Java之間非常兼容:( –