我有一个带ScrollPane的JList。当我按下一个按钮时,新的一行被添加到JList。但问题是它没有滚动到最后一个元素,而是第二个最后一个元素。这是使用的代码的一部分:没有错误。除此之外,一切都很好。
DefaultListModel<String> model = new DefaultListModel<String>();
JList<String> list = new JList<String>(model);
JPanel panel = new JPanel(new GridLayout(0,1));
panel.add(list);
scroll = new JScrollPane(panel);
JPanel p = new JPanel(new BorderLayout());
p.add(scroll, BorderLayout.CENTER);
p.add(buttonPanel, BorderLayout.SOUTH); // here are more button's including the one with the action described below
public void actionPerformed(ActionEvent e) {
list.setFont(new Font("Times new Roman", Font.PLAIN, 30));
model.add(list.getModel().getSize(), "Some text randomly"+ i++);
panel.repaint();panel.revalidate();
scroll.getVerticalScrollBar().setValue(scroll.getVerticalScrollBar().getMaximum());
}
答案 0 :(得分:0)
我认为实际重新绘制在此方法结束后发生。尝试使用SwingUtilities.invokeLater()
调用最后一行,如下所示:
SwingUtilities.invokeLater(new Runnable() { public void run() {
scroll.getVerticalScrollBar().setValue(scroll.getVerticalScrollBar().getMaximum());
}
});
在将其复制粘贴到IDE中时要小心:HTML中存在一个隐藏字符(零宽度非连接符),这是Java代码中不允许的。只需在getMaximum()
之后移除大括号之间的所有内容。
(在Java 8中,您可以使用Lambda表达式使此语句更小且更易读。)