如何防止JScrollBar滚动某些事件,如页面向下?

时间:2011-08-24 19:58:07

标签: java swing jscrollpane jscrollbar

我有一个非常大的数据视图。我想要一个用户的滚动条,但我想要覆盖滚动条按下向上和向下箭头(或键盘上的上下键)处理的标准方式,以及单击进行翻页的轨道区域和向下翻页。这是因为数据流式传输到视图中,JScrollBar的“min / max / value”模型不适用于此。

处理这些鼠标或键事件的标准方法是滚动条的值通过“单位增量”(较小的值)或“块增量”(较大的值)进行调整。 我不希望滚动条在点击时更改其值;我只想收到一个事件,说“用户请求按块向上滚动”或“用户请求向下滚动一个单元”。有谁知道这样做的方法?

顺便说一句,似乎BasicScrollBarUI$TrackListener.mousePressed(MouseEvent)处理了点击,它总是调用scrollbar.setValue(newValue)。所以我可能运气不好:(

也许有一种方法可以使用SWT滚动条进行操作?

2 个答案:

答案 0 :(得分:1)

Swing组件使用Actions来处理KeyStrokes和许多鼠标事件。查看Key Bindings以获取滚动条支持的操作列表。

您应该可以使用自己的自定义操作替换这些操作。

答案 1 :(得分:1)

我想出了怎么做。我为滚动条指定了一个扩展默认BasicScrollBarUI的自定义用户界面,但覆盖了我需要的两个重要方法:scrollByBlock()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));
    }
}