如何增加JScrollPane上缓慢滚动的速度?

20

我在我的项目中向JScrollPane中添加了一个JPanel

一切工作都很正常,但是在JPanel中使用鼠标滚轮时,有一个问题,它的速度非常慢。如何让它滚动得更快?

我的代码如下:

JPanel panel = new JPanel();

panel.setLayout(new BorderLayout());
objCheckBoxList = new CheckBoxList();
BaseTreeExplorer node = (BaseTreeExplorer)projectMain.objCommon.tree.getLastSelectedPathComponent();
if (node.getObject() != null) {
    cmbList.setSelectedItem(node.getParent().toString());
} else {
    if (node.toString().equalsIgnoreCase("List of attributes")) {
        cmbList.setSelectedIndex(0);
    } else {
        cmbList.setSelectedItem(node.toString());
    }
}

panel.add(objCheckBoxList);

JScrollPane myScrollPanel = new JScrollPane(panel);

myScrollPanel.setPreferredSize(new Dimension(200, 200));
myScrollPanel.setBorder(BorderFactory.createTitledBorder("Attribute List"));
2个回答

44
你可以使用以下代码来设置滚动速度。
myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);
这里有详细信息。


1
这个 bug 似乎是因为 swing 将滚动速度解释为像素而不是文本行数所导致的。如果你正在寻找更易于使用的替代方案,可以使用以下函数来计算并设置实际期望的滚动速度(以像素为单位):
public static void fixScrolling(JScrollPane scrollpane) {
    JLabel systemLabel = new JLabel();
    FontMetrics metrics = systemLabel.getFontMetrics(systemLabel.getFont());
    int lineHeight = metrics.getHeight();
    int charWidth = metrics.getMaxAdvance();
            
    JScrollBar systemVBar = new JScrollBar(JScrollBar.VERTICAL);
    JScrollBar systemHBar = new JScrollBar(JScrollBar.HORIZONTAL);
    int verticalIncrement = systemVBar.getUnitIncrement();
    int horizontalIncrement = systemHBar.getUnitIncrement();
            
    scrollpane.getVerticalScrollBar().setUnitIncrement(lineHeight * verticalIncrement);
    scrollpane.getHorizontalScrollBar().setUnitIncrement(charWidth * horizontalIncrement);
}

请注意,当swing包含像JTableJTextArea这样的单个组件时,它确实会正确计算滚动速度。此修复程序特别适用于当您的滚动窗格包含JPanel时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接