2016-05-10 3 views
1

У меня есть панель JScrollPane с JList mediaList. Содержание списка поддерживается DefaultListModel. Я получаю новую модель списка после запроса через JDBC (Sqlite 3)JList's ListCellRenderer не печатает нужный индекс DefaultListModel

Я столкнулся с проблемой, когда область прокрутки не рисует новый индекс модели, когда размер вновь созданной модели больше, чем размер более ранняя модель.

// Фрагмент кода

label.addMouseListener (new MouseAdapter() { 
    DefaultListModel<HashMap<String,String>> mediaModel=new DefaultListModel<>(); 
    mediaModel=mProvider.getNextMenu(paramsCid); // new DefaultListModel 

    medialist = new JList(mediaModel); 
    medialist.setOpaque(false);   
    medialist.setCellRenderer(new MediaCellRenderer()); 

    panel = new JScrollPane(medialist); 
    panel.setPreferredSize(new Dimension(300,300)); 
    pane1.setOpaque(true); 
}); 

class MediaCellRenderer implements ListCellRenderer { 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     System.out.println("index: "+index); 
     JLabel menuTextLabel = new JLabel(mediaModel.get(index).get("title")); 
     return menuTextLabel; 
    } 
} 

заметили, что MediaCellRenderer печатает ниже индекса, когда длина mediaModel составляет 2

index: 0 
index: 1 

Но он печатает ниже индекса, когда длина mediaModel составляет 3

index: 0 
index: 1 
index: 0 // it prints 0 instead of 2 

Может ли кто-нибудь помочь в решении этой проблемы?

+0

Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). Жесткий код некоторых данных для замены БД. –

+0

getNextMenu в приведенном выше коде дает команду DefaultlistModel формы ниже: HashMap fieldList = new HashMap (); listModel.addElement (FieldList); – Kalx

+0

* ".. в приведенном выше коде даёт .." * Не пытайтесь объяснить словами. Я посмотрю более внимательно на MCVE. –

ответ

1

Прежде всего, ваш код рендеринга неверен. Вы НЕ должны создавать новую JLabel. Идея использования средства визуализации заключается в совместном использовании одного и того же средства визуализации для всех элементов в JList. Это делает его более эффективным. Прочтите раздел из руководства Swing по телефону Using a Custom Renderer для получения дополнительной информации. Обратите внимание, что вам нужно будет перейти по ссылке к учебному курсу со списком для примера кода примера визуализации.

Но он печатает ниже индекса, когда длина mediaModel составляет 3

Проблема в том, вы не добавили новые ListModel в GUI.

mediaModel=mProvider.getNextMenu(paramsCid); 
medialist = new JList(mediaModel); 
medialist.setOpaque(false);   
medialist.setCellRenderer(new MediaCellRenderer()); 

panel = new JScrollPane(medialist); 
panel.setPreferredSize(new Dimension(300,300)); 
pane1.setOpaque(true); 

выше создает новый JScrollPane, но вы не добавили ScrollPane к раме.

Лучшим решением будет просто обновить JList с новым ListModel:

mediaModel=mProvider.getNextMenu(paramsCid); 
mediaList.setModel(mediaModel); 
//medialist = new JList(mediaModel); 
//medialist.setOpaque(false);   
//medialist.setCellRenderer(new MediaCellRenderer()); // may need this as well? 

//panel = new JScrollPane(medialist); 
//panel.setPreferredSize(new Dimension(300,300)); 
//pane1.setOpaque(true); 

это обновит существующую панель прокрутки с новым JList.

+0

Вышеупомянутое решение работало для меня. Спасибо! Спасибо! – Kalx

Смежные вопросы