Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pick Color with JComboBox Java Swing

I have a JComboBox where I want for user to select color. JComboBox is displaying just the colors, without any text. I've come up with this solution. Please advise me if this is good or it should be avoided and why. I am new to Swing and Java in general so please be patient :)

public class ToolBar{
    private MainFrame mainFrame;

    public ToolBar (MainFrame mainFrame) {
        this.mainFrame = mainFrame;
    }

    public JPanel getToolBar(){

        JPanel toolbarPanel = new JPanel(new FlowLayout(FlowLayout.LEADING,2,2));
        toolbarPanel.setPreferredSize(new Dimension(mainFrame.getScreenWidth(),60));
        toolbarPanel.setBorder(BorderFactory.createLineBorder(Color.gray));

        JButton fillButton = new JButton("Fill: ");
        fillButton.setPreferredSize(new Dimension(60,20));
        //fillButton.setBackground(Color.red);
        toolbarPanel.add(fillButton);

        String[] test = {" ", " " , " " , " " , " " , " "};
        JComboBox colorBox = new JComboBox(test);
        colorBox.setMaximumRowCount(5);
        colorBox.setPreferredSize(new Dimension(50,20));
        colorBox.setRenderer(new MyCellRenderer());
        toolbarPanel.add(colorBox);

        return toolbarPanel;
    }
    class MyCellRenderer extends JLabel implements ListCellRenderer {  
         public MyCellRenderer() {  
             setOpaque(true);  
         }  
         public Component getListCellRendererComponent(  
             JList list,  
             Object value,  
             int index,  
             boolean isSelected,  
             boolean cellHasFocus)  
         {  
             setText(value.toString()); 
             switch (index) {
                case 0:  setBackground(Color.white);
                break;
                case 1:  setBackground(Color.red);
                break;
                case 2:  setBackground(Color.blue);
                break;
                case 3:  setBackground(Color.yellow);
                break;
                case 4:  setBackground(Color.green);
                break;
                case 5:  setBackground(Color.gray);
                break;
             }
             return this;  
         }  
    }
}

This works ok. It is displaying empty selection elements in JComboBox with different colors. Problem is that when user selects color, color of selection in JComboBox does not change. Which lines of code should I add and where so that when user selects the color from a list that color is displayed in JComboBox field?

I tried some solutions but result was that when user picks color selection in JComboBox always changes to gray...

I've looked through several similar questions but I just can't figure out which part of code is dealing with changing of color of JComboBox when the selection has been done...

like image 743
Dusan Cankovic Avatar asked Sep 16 '13 14:09

Dusan Cankovic


2 Answers

Try this, should work. You have to override setBackground... because, internal mechanism uses default colors from current Look&Feel:

Color[] colors={Color.white,Color.red,Color.blue,Color.green};
JComboBox colorBox = new JComboBox(colors);
colorBox.setMaximumRowCount(5);
colorBox.setPreferredSize(new Dimension(50,20));
colorBox.setRenderer(new MyCellRenderer());

And ListCellRender:

class MyCellRenderer extends JButton implements ListCellRenderer {  
     public MyCellRenderer() {  
         setOpaque(true); 

     }
     boolean b=false;
    @Override
    public void setBackground(Color bg) {
        // TODO Auto-generated method stub
         if(!b)
         {
             return;
         }

        super.setBackground(bg);
    }
     public Component getListCellRendererComponent(  
         JList list,  
         Object value,  
         int index,  

         boolean isSelected,  
         boolean cellHasFocus)  
     {  

         b=true;
         setText(" ");           
         setBackground((Color)value);        
         b=false;
         return this;  
     }  
}
like image 84
alhugone Avatar answered Oct 16 '22 07:10

alhugone


ComboBox uses equals and all your strings are equal. Define color names

String[] test = {"red", "green" , "blue" ...};

But in the renderer call setText(" ");

like image 21
StanislavL Avatar answered Oct 16 '22 08:10

StanislavL