如何在运行时更改JList的单元格图标

如何更改仅一个JList单元格的JLabel图标(例如:单击JList)? 我尝试使用listCellRender访问JLabel,但它不起作用:

@Override public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { ListCellRenderer r = list.getCellRenderer(); JLabel comp = (JLabel) r.getListCellRendererComponent(list, list.getSelectedValue(), list.getSelectedIndex(), false, false); comp.setIcon(UIManager.getIcon("Tree.leafIcon")); } 

有人能说点什么吗? 提前致谢!

我的代码:

 import java.awt.*; import java.util.Arrays; import javax.swing.*; import javax.swing.event.*; /** * @see http://stackoverflow.com/questions/7620579 * @see http://stackoverflow.com/questions/4176343 */ public class ListPanel extends JPanel { private static final long serialVersionUID = -5558761237888601952L; private static final int N = 5; private DefaultListModel dlm = new DefaultListModel(); private JList list = new JList(dlm); private ListRenderer myRender; // http://stackoverflow.com/questions/13752188/chat-client-emoticons-window-java // http://docs.oracle.com/javase/tutorial/uiswing/components/icon.html VER public ListPanel() { super(new GridLayout()); for (int i = 0; i > " + index); label.setBorder(BorderFactory.createEmptyBorder(N, N, N, N)); label.setIcon(UIManager.getIcon("html.pendingImage")); label.setHorizontalTextPosition(JLabel.CENTER); label.setVerticalTextPosition(JLabel.BOTTOM); return label; } } private class SelectionHandler implements ListSelectionListener { @Override public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { System.out.println(list.getSelectedValue()); } } } private void display() { JFrame f = new JFrame("ListPanel"); //f.setPreferredSize(new Dimension(400, 400)); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new ListPanel().display(); } }); } } 

你正在倒退。 单元格渲染器应该只使用isSelected参数并在此参数为true时设置所需的图标,如果为false则不设置图标。

不需要选择监听器。 选择更改时,将自动调用渲染器。

  • 我认为有更简单的方法作为public void valueChanged(ListSelectionEvent e) {来自ListSelectionListener

  • 请参阅getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {在那里你可以覆盖isSelected ,对于SelectionModel中的cellHasFocus是更好的cellHasFocus

有没有办法在渲染后更改图标?

您可以根据渲染时的索引或值等条件动态选择图标。 使用此处引用的示例,以下渲染器生成显示的图像。 您可以随时更新图标并repaint()

列表面板图标

 private class ListRenderer extends DefaultListCellRenderer { Icon icon1 = UIManager.getIcon("html.pendingImage"); Icon icon2 = UIManager.getIcon("html.missingImage"); public ListRenderer() { this.setBorder(BorderFactory.createLineBorder(Color.red)); } @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel label = (JLabel) super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus); label.setBorder(BorderFactory.createEmptyBorder(N, N, N, N)); label.setIcon(icon1); if (index % 2 == 0) { label.setIcon(icon2); } label.setHorizontalTextPosition(JLabel.CENTER); label.setVerticalTextPosition(JLabel.BOTTOM); return label; } }