使用DefaultListCellRenderer设置JList图标?

Kyl*_*leM 2 java swing jfilechooser

下面的代码应该从JFileChooser获取默认目录图标,然后在我自定义的"Recent Directories"列表中使用该图标,该列表作为JFileChooser对话框的附件提供.有人可以解释为什么下面的代码不起作用(特别是为什么在DefaultListRenderer上的setIcon没有做到这一点),并告诉我如何将图标放在JList中的每个项目旁边?我宁愿避免实现我自己的ListCellRenderer,除非这是使其工作的唯一方法.

import java.awt.*;
import java.io.File;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Chooser extends JPanel {
   private static final String[] BUTTON_TEXTS = { "Hello", "Goodbye",
         "Hello Goodbye", "Adios", "This is a long String for WTF", "Hello",
         "Goodbye", "Hello Goodbye", "Adios", "This string WTF" };

   public Chooser(Icon icon) {
      this.setLayout(new BorderLayout());

      JPanel labelPanel = new JPanel(new BorderLayout());
      JLabel label = new JLabel("Recent Directories:");
      labelPanel.add(label, BorderLayout.LINE_START);
      labelPanel.setBackground(Color.LIGHT_GRAY);
      labelPanel.setBorder(new EmptyBorder(5, 10, 5, 0));

      DefaultListModel model = new DefaultListModel();
      JList list = new JList(model);
      DefaultListCellRenderer renderer = (DefaultListCellRenderer)list.getCellRenderer();
      renderer.setIcon(icon);

      for (String s : BUTTON_TEXTS) model.addElement(s);

      list.setBorder(new EmptyBorder(0, 5, 5, 0));
      list.addListSelectionListener(new ListSelectionListener() {
         public void valueChanged(ListSelectionEvent e) {
            // respond to selection here
         }
      });

      add(labelPanel, BorderLayout.PAGE_START);
      // add(new JScrollPane(buttonPanel), BorderLayout.CENTER);
      add(new JScrollPane(list), BorderLayout.CENTER);
   }

   public static void main(String[] args) {
      // TODO Auto-generated method stub
      JFileChooser fileChooser = new JFileChooser();
      Icon icon = fileChooser.getIcon(new File("."));

      /*JFrame frame = new JFrame();
      frame.setSize(100,100);
      JPanel temp = new JPanel();
      JLabel tlbl = new JLabel("picture");
      tlbl.setIcon(icon);
      temp.add(tlbl);
      frame.add(temp);
      frame.setVisible(true);*/

      Chooser c = new Chooser(icon);

      fileChooser.setAccessory(c);
      fileChooser.showOpenDialog(null);
   }

}
Run Code Online (Sandbox Code Playgroud)

How*_*ard 7

DefaultListCellRenderer清除每当其图标getListCellRendererComponent方法被调用.

相反,您可以通过子类化来干扰渲染器的方法DefaultListCellRenderer:

list.setCellRenderer(new DefaultListCellRenderer() {
    @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.setIcon(icon);
        return label;
    }
});
Run Code Online (Sandbox Code Playgroud)