2012-06-08 11 views
9

Próbuję utworzyć ComboBox, który używa różnych kolorów dla różnych elementów. Napisałem kod testowy, ale nie działa. Dodanie renderera powoduje awarię programu, ale skomentowanie go powoduje, że pole wyświetla się w ramce.Wiele kolorów dla każdej pozycji w JComboBox

Czy jest coś czego mi brakuje lub czy robię to w niewłaściwy sposób? Próbowałem użyć samouczka custom ComboBox Renderer jako przykładu.

Oto mój kod:

TestComboColor.java

import java.awt.Color; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 


public class TestComboColor { 

    static Color[] colors = {Color.BLUE, Color.GRAY, Color.RED}; 
    static String[] strings = {"Test1", "Test2", "Test3"}; 

    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("JAVA"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JComboBox cmb = new JComboBox(); 
     ComboBoxRenderer renderer = new ComboBoxRenderer(cmb); 

     renderer.setColors(colors); 
     renderer.setStrings(strings); 

     cmb.setRenderer(renderer); 

     frame.add(cmb); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

ComboBoxRenderer.java

import java.awt.Color; 
import java.awt.Component; 

import javax.swing.JComboBox; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.ListCellRenderer; 


public final class ComboBoxRenderer extends JPanel implements ListCellRenderer 
{ 

    private static final long serialVersionUID = -1L; 
    private Color[] colors; 
    private String[] strings; 

    JPanel textPanel; 
    JLabel text; 

    public ComboBoxRenderer(JComboBox combo) { 

     textPanel = new JPanel(); 
     textPanel.add(this); 
     text = new JLabel(); 
     text.setOpaque(true); 
     text.setFont(combo.getFont()); 
     textPanel.add(text); 
    } 

    public void setColors(Color[] col) 
    { 
     colors = col; 
    } 

    public void setStrings(String[] str) 
    { 
     strings = str; 
    } 

    public Color[] getColors() 
    { 
     return colors; 
    } 

    public String[] getStrings() 
    { 
     return strings; 
    } 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
      int index, boolean isSelected, boolean cellHasFocus) { 

     if (isSelected) 
     { 
      setBackground(list.getSelectionBackground()); 
     } 
     else 
     { 
     } 

     if (colors.length != strings.length) 
     { 
      System.out.println("colors.length does not equal strings.length"); 
      return this; 
     } 
     else if (colors == null) 
     { 
      System.out.println("use setColors first."); 
      return this; 
     } 
     else if (strings == null) 
     { 
      System.out.println("use setStrings first."); 
      return this; 
     } 

     text.setText(strings[index]); 
     text.setForeground(colors[index]); 
     text.setBackground(getBackground()); 
     return text; 


    } 

} 

Dzięki!

+0

to tablice kolorów może być ścisły bezpiecznych kolorów, surowe dla dowolnych kolorach lub w połączeniu z JColorChooser ??? – mKorbel

+0

Tablica kolorów powinna być w stanie wprowadzić dowolny kolor, w tym (nowy kolor (#, #, #)), chociaż właśnie używałem bezpiecznych kolorów (Color.BLUE, itp.) Do celów testowych. Ponadto, w ogóle nie używam programu JColorChooser. –

Odpowiedz

12

Czy to masz na myśli?

TestComboColor

import java.awt.Color; 
import java.awt.Component; 
import javax.swing.*; 

public class TestComboColor { 

    static Color[] colors = {Color.BLUE, Color.GRAY, Color.RED}; 
    static String[] strings = {"Test1", "Test2", "Test3"}; 

    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("JAVA"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JComboBox cmb = new JComboBox(strings); 
     ComboBoxRenderer renderer = new ComboBoxRenderer(cmb); 

     renderer.setColors(colors); 
     renderer.setStrings(strings); 

     cmb.setRenderer(renderer); 

     frame.add(cmb); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

class ComboBoxRenderer extends JPanel implements ListCellRenderer 
{ 

    private static final long serialVersionUID = -1L; 
    private Color[] colors; 
    private String[] strings; 

    JPanel textPanel; 
    JLabel text; 

    public ComboBoxRenderer(JComboBox combo) { 

     textPanel = new JPanel(); 
     textPanel.add(this); 
     text = new JLabel(); 
     text.setOpaque(true); 
     text.setFont(combo.getFont()); 
     textPanel.add(text); 
    } 

    public void setColors(Color[] col) 
    { 
     colors = col; 
    } 

    public void setStrings(String[] str) 
    { 
     strings = str; 
    } 

    public Color[] getColors() 
    { 
     return colors; 
    } 

    public String[] getStrings() 
    { 
     return strings; 
    } 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
      int index, boolean isSelected, boolean cellHasFocus) { 

     if (isSelected) 
     { 
      setBackground(list.getSelectionBackground()); 
     } 
     else 
     { 
      setBackground(Color.WHITE); 
     } 

     if (colors.length != strings.length) 
     { 
      System.out.println("colors.length does not equal strings.length"); 
      return this; 
     } 
     else if (colors == null) 
     { 
      System.out.println("use setColors first."); 
      return this; 
     } 
     else if (strings == null) 
     { 
      System.out.println("use setStrings first."); 
      return this; 
     } 

     text.setBackground(getBackground()); 

     text.setText(value.toString()); 
     if (index>-1) { 
      text.setForeground(colors[index]); 
     } 
     return text; 
    } 
} 
+0

Tak! Perfekcyjnie, dziękuję! –

+0

Nie ma za co. :) –

+1

+1 [Chodzi mi o to, potrzebne trochę modyfikacji] (http://stackoverflow.com/a/10723340/714968) – mKorbel