我有一个 JScrollPane
面板 JList mediaList
. 列表的内容由 DefaultListModel
. 通过jdbc(sqlite3)进行查询之后,我得到了新的列表模型
当新生成的模型的大小大于先前获取的模型的大小时,滚动窗格不会绘制模型的新索引。
//代码段
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
有人能帮忙解决这个问题吗?
1条答案
按热度按时间0qx6xfy61#
首先,你的渲染代码是不正确的。您不应该创建新的jlabel。使用渲染器的想法是为jlist中的所有项共享相同的渲染器。这使它更有效率。有关详细信息,请阅读swing教程中有关使用自定义渲染器的部分。注意:对于实际的渲染器示例代码,您需要按照组合框教程的链接进行操作。
但是,当mediamodel的长度为3时,它会打印到索引之下
问题是您没有将新的listmodel添加到gui中。
上面的代码创建了一个新的jscrollpane,但是您还没有将scrollpane添加到框架中。
更好的解决方案是只更新
JList
用新的ListModel
:这将用新的jlist更新现有的滚动窗格。