使用鼠标滚轮时如何加快 JScrollPane 中的滚动速度?
Posted
技术标签:
【中文标题】使用鼠标滚轮时如何加快 JScrollPane 中的滚动速度?【英文标题】:How do I speed up the scroll speed in a JScrollPane when using the mouse wheel? 【发布时间】:2011-07-31 19:23:52 【问题描述】:我看到了JScrollPane.setWheelScrollingEnabled(boolean)
方法来启用或禁用鼠标滚轮滚动。不过,有什么办法可以调整滚动的速度吗?在我看来,这是非常缓慢的。无论我制作什么尺寸的窗口,每次点击滚动大约三个像素。我希望它不止于此。
有什么想法吗?
【问题讨论】:
注意:对于正在寻找与此等效的 JavaScript 的任何人,请参阅 Speed up mouse wheel in jScrollPane (jQuery)。 【参考方案1】:为了更精准的控制,被滚动的组件可以实现Scrollable接口。这允许您动态计算滚动单元大小(箭头按钮和箭头键)和滚动块大小(鼠标滚轮)。
How to use Scroll Panes
【讨论】:
【参考方案2】:我加快滚动速度的解决方案:
添加滚动条的参数:
scrollPane.getVerticalScrollBar().putClientProperty("JScrollBar.fastWheelScrolling", true);
实现一个***监听器(在 jViewport 内的组件上):
public void mouseWheelMoved(MouseWheelEvent e)
boolean isCtrl = (e.getModifiersEx() & MouseWheelEvent.CTRL_DOWN_MASK) != 0;
boolean isShift = (e.getModifiersEx() & MouseWheelEvent.SHIFT_DOWN_MASK) != 0;
MouseWheelEvent eventToDispatch = e;
if (isCtrl || isShift)
int amountMulti = 1;
int rotMulti = 1;
if (isCtrl)
amountMulti *= 10;
if (isShift)
amountMulti *= 5;
rotMulti *= 2;
int mod = e.getModifiers() & ~InputEvent.CTRL_MASK & ~InputEvent.SHIFT_MASK;
int modEx = e.getModifiersEx() & ~MouseWheelEvent.CTRL_DOWN_MASK & ~MouseWheelEvent.SHIFT_DOWN_MASK;
eventToDispatch = new MouseWheelEvent(this, e.getID(), e.getWhen()
, mod | modEx, e.getX(), e.getY()
, e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger()
, e.getScrollType(), e.getScrollAmount()*amountMulti, e.getWheelRotation()*rotMulti
, e.getPreciseWheelRotation()*amountMulti*rotMulti);
getParent().dispatchEvent(eventToDispatch);
wheelRotation 的增加是必须的:否则滚动的行数将受限于屏幕的大小。
【讨论】:
我已经修复了代码,因此移除了 SHIFT 和 CTRL 标志以防止水平滚动。我确信 jdk 的家伙在我原来的帖子之后已经用 shift 键向 jdk 添加了水平滚动。反对者:如果解决方案现在对您有效,请删除您的反对意见,或者发表评论并解释仍然缺少的内容。【参考方案3】:我试图找到一种更好的方法来阅读我的 ScrollPane 中的 32000 行
试试这个
scrollPane.getVerticalScrollBar().setUnitIncrement(100);
scrollPane.getViewport().putClientProperty("EnableWindowBlit", Boolean.TRUE);
scrollPane.getViewport().setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);
【讨论】:
【参考方案4】:您也可以使用它。
SwingUtil.setScrollUnitIncrement(yourScrollPane);
【讨论】:
嗯 ... SwingUtil 是什么?假设该方法将给定 scrollPane 的增量设置为哪个值和哪个滚动条?【参考方案5】:如果你想设置鼠标滚轮滚动量独立于滚动条单元,你可以使用Mouse Wheel Controller。
【讨论】:
我应该在我的项目中包含一个额外的类而不是编写一行代码,这有什么好处? @ErickRobertson,它只是为了给你增加灵活性。默认滚动为单位增量值的 3 倍。例如,对于 JTable,单位增量默认为行高,因此默认滚动为 3 行。如果出于某种原因,您的要求是一次滚动一页或一次滚动 5 行,您不能仅通过操作单位值来实现。此外,每个 LAF 的默认行高可能不同。通过在相对基础上操纵滚动量,您可以获得更好的跨平台支持。 值 '3'(滚动单位)来自系统控制面板,Java 尊重它,使您能够在系统范围内对其进行修改。【参考方案6】:你可以试试这个:
myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);
【讨论】:
美丽。我还注意到这会影响滚动条中的向上和向下箭头,这也是非常需要的。 @AlizainPrasla - 初始化此滚动面板时。 您会如何影响单击滚动框和滚动条中向上或向下箭头之间的区域? @Rune - 滚动条似乎设置为鼠标位置,忽略单位增量值。 @AndreiPodoprîgora 您应该注意,更改此值只会更改使用鼠标滚轮(或其他允许滚动的设备)、箭头键和滚动条箭头滚动时的滚动速度。当拖动滚动条旋钮时,此值不会影响滚动窗格的移动速度。很难改变这个值。如果你想实现这一点,你应该向滚动条添加自定义调整监听器并更改它的值。【参考方案7】:一种方法是将滚动条的单位增量设置为更大的数字:
scrollPane.getVerticalScrollBar().setUnitIncrement(20);
【讨论】:
【参考方案8】:您可以通过设置滚动条的单位增量来做到这一点。请参阅示例。
yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);
【讨论】:
【参考方案9】:快速搜索显示此页面:How to increase the JScrollPane scrolling speed for mousewheel users。事实证明,滚动增量是滚动条本身的属性 (JScrollBar.setUnitIncrement
) 而不是滚动窗格。
【讨论】:
以上是关于使用鼠标滚轮时如何加快 JScrollPane 中的滚动速度?的主要内容,如果未能解决你的问题,请参考以下文章