I've got the next code:
listModel = new DefaultListModel();
listModel.addElement(dateFormat.format(new Date()) + ": Msg1");
messageList = new JList(listModel);
messageList.setLayoutOrientation(JList.VERTICAL);
messageScrollList = new JScrollPane(messageList);
messageScrollList.setPreferredSize(new Dimension(500, 200));
messageScrollList.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
}
});
It auto scrolls down. But, if I try to scroll back up to re-read a message, it forces a scroll down. How can I fix this?
To auto scroll I am using a very simple concept of static variable and list.makeVisible(int index)
I used
JScrollPane
withJTextArea
. I avoided force scroll down by scrolling only whenJScrollBar max
value changed:I suppose, there is better solution to filter events without extra variables, and would appreciate if somebody post it.
@question enquirer. Please change your code from
to
That is change
getMaximum()
togetValue()
Then it works as required.getMaximum()
takes the scroller to its maximum; whilegetValue()
takes it wherever event happens.You can avoid using this piece of code altogether if you put one line
That works like
add(component)
for jList and gets its inherent behaviour.I found this really useful: http://forums.sun.com/thread.jspa?threadID=623669 (post by 'inopia')
It works perfectly
As he says: "The problem here is that it can become a bit difficult to find an event that fires after both the ListModel, JList and JScrollPane have been updated."
When adding a new message, invoke
scrollRectToVisible()
on theJList
using aRectangle
having the same dimensions as your message pane's preferred size. Given a vertical orientation, it may be convenient to make the preferred size of theJScrollPane
'sJViewport
an integral multiple of the message pane's height. See also: How to Use Scroll Panes.Addendum: This compelling discussion of Text Area Scrolling may be helpful, too.