2013-09-16 2 views
4

J'ai un JComboBox où je veux que l'utilisateur choisisse la couleur. JComboBox affiche uniquement les couleurs, sans aucun texte. J'ai trouvé cette solution. S'il vous plaît me conseiller si cela est bon ou il devrait être évité et pourquoi. Je suis nouveau à Swing et Java en général alors s'il vous plaît soyez patient :)Choisissez couleur avec JComboBox Java Swing

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; 
     } 
    } 
} 

Cela fonctionne bien. Il affiche des éléments de sélection vides dans JComboBox avec des couleurs différentes. Le problème est que lorsque l'utilisateur sélectionne la couleur, la couleur de la sélection dans JComboBox ne change pas. Quelles lignes de code devrais-je ajouter et où donc quand l'utilisateur sélectionne la couleur d'une liste dans laquelle cette couleur est affichée dans le champ JComboBox?

J'ai essayé quelques solutions mais le résultat est que lorsque l'utilisateur choisit la sélection des couleurs dans JComboBox change toujours gris ...

J'ai regardé à travers plusieurs questions similaires, mais je ne peux pas comprendre quelle partie du code de traite de changement de couleur de JComboBox lorsque la sélection a été faite ...

+0

S'il vous plaît utiliser le code pour le formatage des documents code, entrée/sortie et structurés comme HTML ou XML. Pour ce faire, sélectionnez l'échantillon et cliquez sur le bouton "{}" au-dessus du formulaire de publication/d'édition. –

+0

J'ai utilisé le bouton CODE pour marquer le code dans ma question ... Je vais essayer avec {} la prochaine fois;) Désolé pour le dérangement. –

Répondre

3

Essayez ceci, ça devrait marcher. Vous devez passer outre setBackground ... parce que, le mécanisme interne utilise des couleurs par défaut de Look actuel & 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()); 

Et 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; 
    } 
} 
+0

Salutations m8! Très appréciée! Je viens de changer 'setText (" ");' en 'setText (" ");' et ajouté 'setPreferredSize (new Dimension (50,20));' line à la méthode getListCellRendererComponent pour atteindre pleinement mes objectifs. Je voudrais vous voter mais j'ai besoin de 15 réputation :) Merci encore m8! –

2

ComboBox utilise égal et toutes vos chaînes sont égales. Définir les noms de couleurs

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

Mais dans l'appel renderer setText(" ");

+0

J'ai changé de code comme vous l'avez demandé: 'toolbarPanel.add (fillButton); Chaîne [] test = {"blanc", "rouge", "bleu", "jaune", "vert", "gris"}; \t \t JComboBox ColorBox = new JComboBox (test); ' et générateur de: ' setText (» «); \t commutateur (index) { \t case 0: setBackground (Couleur.white); break; ' mais quand je fais la sélection la couleur grise est affichée dans JComboBox, quelle que soit la couleur que j'ai choisie ... Merci pour votre temps m8! Apprécié! –

+2

Je serais d'utilisation en toute sécurité Couleurs de couleurs [] = {Couleur.BLACK, Color.BLUE, Color.GREEN, Color.RED, Color.WHITE, Color.YELLOW}; – mKorbel

+1

@mKorbel accepte que les couleurs sont mieux :) – StanislavL

0

Ajouter un cas pour l'index == -1 et définir la couleur d'arrière-plan de la CellRenderer pour la dernière sélection de l'utilisateur.