JScrollPane 和 JList 自动滚动

2022-09-04 03:06:29

我有下一个代码:

    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());  
        }
    }); 

它会自动向下滚动。但是,如果我尝试向上滚动以重新阅读消息,则会强制向下滚动。我该如何解决这个问题?


答案 1

添加新消息时,使用与消息窗格首选大小具有相同尺寸的矩形JList 上调用 scrollRectToVisible()。给定垂直方向,将 JScrollPaneJViewport 的首选大小设置为消息窗格高度的整数倍可能很方便。另请参见:如何使用滚动窗格

附录:这个关于文本区域滚动的引人注目的讨论也可能有所帮助。


答案 2
this.list = blah blah... 
this.list.setSelectedValue(whatever);   
final JScrollPane sp = new JScrollPane(this.list); // needs to be after the parent is the sp 
this.list.ensureIndexIsVisible(this.list.getSelectedIndex());

推荐