当我想要时更改JList项目颜色

问题描述:

我正在尝试构建一个JList,其中某些项目的背景颜色与其他项目不同,但仅限于我需要时。当我想要时更改JList项目颜色

我一直在试图做这样的事情,它会产生错误。

static DefaultListModel<String> model = new DefaultListModel<>(); 

for(int K=0;K<Collectionsize();K++){ 
     Jlist.setForeground(Color.red); 
     model.addElement(type 1); 

     for(int I=0;I<(subcollection.size();I++){ 
      Jlist.setForeground(Color.white); 
      model.addElement(type 2); 
      } 
     } 

类型1和2之间没有模式,所以我想在需要时更改颜色而不是依赖if语句。

我看到很多人在讨论构建自定义渲染类的问题,但我正在瞄准一些更简单的东西。

+1

*“我看到很多人在谈论建立自定义渲染类,但我的目标有些东西更简单的” *你错误地认为不同的方法会更简单。 –

+2

我正在投票结束这个问题,因为OP想要最简单的方法,但已经拒绝了! –

+0

(1-)'我看到很多人......' - 那么为什么很多人会使用复杂的解决方案,如果有更简单的解决方案存在?你不觉得很多人会使用更简单和普遍接受的方法吗? – camickr

注意:每个项目包含两条信息的项目列表更适合在表格中显示而不是在列表中显示,但如果需要的话,可以将其调整为列表。适用相同的基本原则(使用渲染组件)。

因为我感觉慈善,这是我的意思是:

enter image description here

这是通过这种渲染类实现:

class TrackCellRenderer extends DefaultTableCellRenderer { 

    HashMap<String, Color> colorMap = new HashMap<>(); 
    Random r = new Random(); 

    @Override 
    public Component getTableCellRendererComponent(
      JTable table, 
      Object value, 
      boolean isSelected, boolean hasFocus, 
      int row, int column) { 
     Component c = super.getTableCellRendererComponent(
       table, value, isSelected, hasFocus, row, column); 
     JLabel l = (JLabel) c; 

     String s = (String) value; 
     if (column == 0) { 
      if (!colorMap.containsKey(s)) { 
       Color clr = new Color(
         150 + r.nextInt(105), 
         150 + r.nextInt(105), 
         150 + r.nextInt(105)); 
       colorMap.put(s, clr); 
      } 
      Color color = colorMap.get(s); 
      l.setBackground(color); 
      l.setOpaque(true); 
     } else { 
      l.setOpaque(false); 
     } 

     return l; 
    } 
} 

注:它可能是最好使用枚举,而不是随机分配一种颜色,但有3张专辑和超过一百万种可能的颜色,我们应该很安全。

在刚刚超过100行代码本(二级)MCVE:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 
import javax.swing.table.*; 
import java.util.*; 

public class AlbumTrackTable { 

    private JComponent ui = null; 
    String[][] playList = { 
     {"The Will to Live", "Faded"}, 
     {"The Will to Live", "Homeless Child"}, 
     {"Oh Mercy", "Political Wrold"}, 
     {"Oh Mercy", "What Was it You Wanted?"}, 
     {"Red Sails in the Sunset", "Helps Me Helps You"}, 
     {"Red Sails in the Sunset", "Redneck Wonderland"} 
    }; 
    String[] columnNames = {"Album", "Track"}; 

    AlbumTrackTable() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui != null) { 
      return; 
     } 

     ui = new JPanel(new BorderLayout(4, 4)); 
     ui.setBorder(new EmptyBorder(4, 4, 4, 4)); 

     DefaultTableModel trackModel = new DefaultTableModel(playList, columnNames); 
     JTable table = new JTable(trackModel); 
     ui.add(new JScrollPane(table)); 
     TableCellRenderer renderer = new TrackCellRenderer(); 
     table.setDefaultRenderer(Object.class, renderer); 
     table.setAutoCreateRowSorter(true); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       AlbumTrackTable o = new AlbumTrackTable(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 

class TrackCellRenderer extends DefaultTableCellRenderer { 

    HashMap<String, Color> colorMap = new HashMap<>(); 
    Random r = new Random(); 

    @Override 
    public Component getTableCellRendererComponent(
      JTable table, 
      Object value, 
      boolean isSelected, boolean hasFocus, 
      int row, int column) { 
     Component c = super.getTableCellRendererComponent(
       table, value, isSelected, hasFocus, row, column); 
     JLabel l = (JLabel) c; 

     String s = (String) value; 
     if (column == 0) { 
      if (!colorMap.containsKey(s)) { 
       Color clr = new Color(
         150 + r.nextInt(105), 
         150 + r.nextInt(105), 
         150 + r.nextInt(105)); 
       colorMap.put(s, clr); 
      } 
      Color color = colorMap.get(s); 
      l.setBackground(color); 
      l.setOpaque(true); 
     } else { 
      l.setOpaque(false); 
     } 

     return l; 
    } 
}