2016-12-12 2 views
0

Я пытаюсь построить 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 типа, так что я хочу изменить цвет, когда я хочу, а не полагаться на если заявления.

Я вижу, что многие люди говорят о создании пользовательских классов рендеринга, но я направлял что-то более простое.

+1

* «Я вижу много людей, говорящих о создании пользовательских визуализации классов, но я целился немного что-то более простое» * Вы ошибаетесь, думая, что другой подход будет проще. –

+2

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что OP хочет простейший подход, но уже отклонил его! –

+0

(1-) 'Я вижу много людей ...' - так почему многие люди используют сложное решение, если существует более простое решение? Разве вы не думаете, что многие люди будут использовать более простой и общепринятый подход? – camickr

ответ

2

Примечание. Список элементов, содержащих две части информации для каждого элемента, лучше подходит для отображения в таблице, а не для списка, хотя вы можете при необходимости адаптировать его к списку. Используется один и тот же базовый принцип (используйте компонент рендеринга).

Потому что я чувствую себя благотворительными, это то, что я имею в виду:

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 альбомами и более миллиона возможных цветов, мы должны быть довольно безопасными.

В этом (два класса) MCVE чуть более 100 строк кода:

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; 
    } 
} 
Смежные вопросы