Swroll中的JScrollpane中的ScrollBar运动不平滑

我有这种情况。 我有滚动窗格,其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 } 

看看JScrollBar.setUnitIncrement , JScollPane中的JScollPane JPanels与JListJTableJTextArea相比具有un_natural滚动function

 import 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() { } } 

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

正如@mKorbel所指出的, JTableJList 实现了Scrollable以方便滚动增量,并且它们都使用flyweight模式来渲染速度。 如果您不能直接使用任何一个组件,您仍然可以使用这些模式。 本教程包含Scrollable示例, 此处有一个CellRendererPane示例。