Java JList&x27;s ListCellRenderer未打印DefaultListModel的正确索引
我有一个Java JList&x27;s ListCellRenderer未打印DefaultListModel的正确索引,java,swing,jscrollpane,jlist,defaultlistmodel,Java,Swing,Jscrollpane,Jlist,Defaultlistmodel,我有一个JScrollPane面板,带有JList mediaList。列表的内容由DefaultListModel维护。通过JDBC(Sqlite 3)进行查询后,我得到了新的列表模型 我面临一个问题,当新生成的模型的大小大于先前获取的模型的大小时,滚动窗格不会绘制模型的新索引 //代码片段 label.addMouseListener (new MouseAdapter() { DefaultListModel<HashMap<String,String>>
JScrollPane
面板,带有JList mediaList
。列表的内容由DefaultListModel
维护。通过JDBC(Sqlite 3)进行查询后,我得到了新的列表模型
我面临一个问题,当新生成的模型的大小大于先前获取的模型的大小时,滚动窗格不会绘制模型的新索引
//代码片段
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;
}
}
但是,当mediaModel的长度为3时,它会打印到索引下方
index: 0
index: 1
index: 0 // it prints 0 instead of 2
有人能帮你解决这个问题吗?首先,你的渲染代码不正确。您不应该创建新的JLabel。使用渲染器的想法是为JList中的所有项目共享相同的渲染器。这使它更有效率。有关更多信息,请阅读上的Swing教程部分。注意:对于实际的渲染器示例代码,您需要按照组合框教程的链接进行操作 但是,当mediaModel的长度为3时,它会打印到索引下方
index: 0
index: 1
index: 0 // it prints 0 instead of 2
问题是您没有将新的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,但您尚未将滚动窗格添加到框架中
更好的解决方案是使用新的列表模型更新JList
:
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更新现有的滚动窗格。要更快获得更好的帮助,请发布或。硬编码一些数据以替换上述代码中的DB.getNextMenu,给出以下形式的DefaultlistModel:HashMap fieldList=new HashMap();listModel.addElement(字段列表);“.在上面的代码中给出了…”不要费心用文字解释。我会更仔细地看MCVE。