2011-08-24 57 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之间非常兼容:( –