2012-06-08 52 views
9

我正在嘗試爲不同的項目使用不同顏色的組合框。我寫了一些測試代碼,但它似乎並沒有工作。在渲染器中添加會導致程序崩潰,但將其註釋掉會使框顯示在框中。JComboBox中的每個項目的多種顏色

有什麼我失蹤或我是否這樣做是錯誤的方式嗎?我嘗試使用custom ComboBox Renderer教程作爲示例。

這裏是我的代碼:

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; 


    } 

} 

謝謝!

+0

顏色的這個陣列可能是嚴格安全的顏色,嚴格不管什麼顏色或與結合JColorChooser的??? – mKorbel

+0

儘管我剛剛使用安全顏色(Color.BLUE等)進行測試,但顏色數組應該能夠輸入任何顏色,包括(新顏色(#,#,#))。 另外,我根本沒有使用JColorChooser。 –

回答

12

這是你的意思嗎?

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

是的!完美,謝謝! –

+0

不客氣。 :) –

+1

+1 [我的意思是,需要一點修改](http://stackoverflow.com/a/10723340/714968) – mKorbel