JScrollPane и автоматическая прокрутка JList

У меня есть следующий код:

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

Это автоматические прокрутки вниз. Но, если я пытаюсь прокрутить, создают резервную копию для перечитывания сообщения, оно захлопывает прокрутку. Как я могу зафиксировать это?

14
задан kleopatra 1 December 2011 в 09:57
поделиться

4 ответа

При добавлении нового сообщения вызовите scrollRectToVisible() на JList , используя Rectangle , имеющий те же размеры, что и предпочтительный размер панели сообщений. Учитывая вертикальную ориентацию, может быть удобно сделать предпочтительный размер JScrollPane JViewport , кратным высоте панели сообщений. См. также: Как использовать панели прокрутки .

Добавление: Это увлекательное обсуждение Прокрутка текстовых областей также может оказаться полезным.

10
ответ дан 1 December 2019 в 14:44
поделиться

Я думаю, что вы хотите сделать Это прокручивается вниз, когда вы добавляете вещи в свой мессегист, а затем на корректировку. Таким образом, ваш код может выглядеть так:

Adjustable sb = messageScrollList.getVerticalScrollBar()
boolean onBottom = sb.getValue() == sb.getMaximum();
//
// add your message to the JList.
//
if(onBottom)  sb.setValue(sb.getMaximum());

в противном случае вам нужно будет сказать, была ли корректировка вызвана изменением модели или мышью, и просматривать документы API, я не уверен, что есть способ сделать это с легкостью. Хотя вы могли бы увидеть, регулирует ли readmentEvent.getAdjustmenttyType () , возвращает разные значения в этих случаях, если это правда, вы могли бы просто иметь заявление, если в вашем анонимном внутреннем классе.

Другая вещь, которую вы можете попробовать, будет иметь логическую переменную где-то, которая будет настроен, когда вы добавляете что-то в список. Затем в вашем обработке вы проверяете, установлена ​​ли переменная. Если это так, вы делаете корректировку (и не собираете переменную) в противном случае, вы их игнорируете. Таким образом, в списке добавляется только один прокрутка на предмет.

-1
ответ дан 1 December 2019 в 14:44
поделиться
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());
1
ответ дан 1 December 2019 в 14:44
поделиться

Я нашел это действительно полезным: http://forums.sun.com/thread.jspa?threadID=623669 (сообщение 'inopia')
Работает отлично

Как он говорит: «Проблема здесь в том, что может быть немного сложно найти событие, которое срабатывает после обновления как ListModel, так и JList и JScrollPane».

1
ответ дан 1 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: