Swroll中的JScrollpane中的ScrollBar运动并不流畅

时间:2012-06-25 04:30:09

标签: java swing jscrollpane

我有这样的情况。 我有滚动窗格,其viewportView是JPanel 并且JPanel的布局为BoxLayout。在这个面板中,我添加了一个扩展JPanel的类,该类包含JComponents。

因此,在运行应用程序时,JComponents显示在JScrollPane中。 这就是我的ScrollPane的形成方式。

这里的问题是,当数据超过750行以上时,滚动条开始出现问题。 当用鼠标滚轮向上或向下滚动时,滚动不会平滑移动,它会突然停在中间并再次开始,说它有一个生涩的动作。 我的问题是如何在这种情况下获得平稳的鼠标移动。

我的scrollPane就像这样

public JScrollPane getScrollPane() {
    if (scrollPane == null) {
        scrollPane = new JScrollPane();
        scrollPane.setSize(new Dimension(1000, 433));
        scrollPane.setLocation(new Point(10, 10));
        scrollPane.setColumnHeaderView(getHeaderOfRowPanel());
        scrollPane
                .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setViewportView(getScrollPanel());
        scrollPane
                .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.getVerticalScrollBar().setUnitIncrement(
                unitIncrement);

    }
    return scrollPane;
}

private JPanel getScrollPanel() {
    if (scrollPanel == null) {
        scrollPanel = new JPanel();
        scrollPanel.setBorder(null);
        scrollPanel.setLayout(new BoxLayout(getScrollPanel(),
                BoxLayout.Y_AXIS));
    }
    return scrollPanel;
}


private class RowPanel extends JPanel {
//My components are here ..
//I add this Panel in scrollPanel
}

3 个答案:

答案 0 :(得分:3)

请查看JScrollBar.setUnitIncrementJPanelsJScollPane的{​​{1}}与JListJTableJTextAreaimport javax.swing.*; import java.awt.*; import java.awt.event.*; public class JScrollBarUnitIncrement { public static void main(String[] args) { final JFrame f = new JFrame(""); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(2000, 1)); for (int i = 0; i != 2000; i++) { JButton btn = new JButton("Button 2"); panel.add(btn); } final JScrollPane sPane = new JScrollPane(panel); final int increment = 50; sPane.getVerticalScrollBar().setUnitIncrement(increment); KeyStroke kUp = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0); KeyStroke kDown = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0); sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kUp, "actionWhenKeyUp"); sPane.getActionMap().put("actionWhenKeyUp", new AbstractAction("keyUpAction") { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { final JScrollBar bar = sPane.getVerticalScrollBar(); int currentValue = bar.getValue(); bar.setValue(currentValue - increment); } }); sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kDown, "actionWhenKeyDown"); sPane.getActionMap().put("actionWhenKeyDown", new AbstractAction("keyDownAction") { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { final JScrollBar bar = sPane.getVerticalScrollBar(); int currentValue = bar.getValue(); bar.setValue(currentValue + increment); } }); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(sPane); f.pack(); SwingUtilities.invokeLater(new Runnable() { public void run() { f.setVisible(true); } }); } private JScrollBarUnitIncrement() { } } 相比具有非自然滚动效果

例如

{{1}}

答案 1 :(得分:2)

填充如此巨大的号码永远不会有好处。 JScrollPane中的行数。因为,可视部分仅在视口中说20到30行,具体取决于滚动窗格的高度和RowPanel的高度。那么,为什么要一次填充如此庞大的行?平滑性的问题是因为可能存在异常(请参阅控制台)。所以,解决这个问题,我看到了两个选择。一种是使用分页,另一种是允许用户输入一些搜索条件来过滤掉不需要的记录。

答案 2 :(得分:2)

正如@mKorbel所指出的那样,JTableJList implement Scrollable都可以方便地滚动增量,并且它们都使用flyweight pattern rendering速度。如果您不能直接使用任何一个组件,您仍然可以使用这些模式。本教程包含Scrollable个示例,并且有一个CellRendererPane示例here