2012-06-08 11 views
9

Estoy tratando de hacer un ComboBox que utiliza diferentes colores para diferentes elementos. Escribí un código de prueba pero parece que no funciona. Agregar en el renderizador hace que el programa se cuelgue, pero comentarlo hace que la caja se muestre en el cuadro.Múltiples colores para cada artículo en JComboBox

¿Hay algo que me falta o estoy haciendo esto de la manera incorrecta? Intenté utilizar el tutorial custom ComboBox Renderer como ejemplo.

Aquí está mi código:

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; 


    } 

} 

Gracias!

+0

esta matrices de colores podrían ser estrictos para la seguridad Colores, estricta de cualquier color o combinar con JColorChooser ??? – mKorbel

+0

La matriz de colores debe poder ingresar cualquier color, incluido (nuevo Color (#, #, #)) aunque acabo de utilizar los colores seguros (Color.BLUE, etc.) para propósitos de prueba. Además, no estoy usando JColorChooser en absoluto. –

Respuesta

12

¿Es esto lo que quieres decir?

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

¡Sí! ¡Perfecto, gracias! –

+0

De nada. :) –

+1

+1 [Quise decir, se requieren modificaciones pequeñas] (http://stackoverflow.com/a/10723340/714968) – mKorbel

Cuestiones relacionadas