2016-12-12 17 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の間にパターンがないので、if文に頼るのではなく、色を変更する必要があります。

カスタムレンダリングクラスの作成について多くの人が話していますが、私はもっと簡単なものを目指していました。

+1

*「私はクラスをレンダリングするカスタムビルドが、私はもっと簡単ないくつかのものを目指していたの話を多くの人々を参照してください。」*あなたは、異なるアプローチがより簡単になると考えていると誤解されています。 –

+2

私はOPが最も簡単なアプローチを望んでいるが、既にそれを拒否しているので、この質問をオフトピックとして閉じるよう投票しています! –

+0

(1-)「私はたくさんの人がいます...」 - 簡単な解決策が存在すると、なぜ多くの人が複雑な解決法を使用するのでしょうか?多くの人がより簡単で一般的に受け入れられるアプローチを使用すると思いませんか? – camickr

答えて

2

注:項目ごとに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つのアルバムと100万色以上の色を使用すると、かなり安全です。コードのわずか100行のこの(2クラス)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; 
    } 
} 
関連する問題