2013-01-15 10 views
5

Voglio un JComboBox senza un pulsante freccia (fatto), che ha uno sfondo verde, quando abilitato e uno sfondo grigio quando disabilitato (non eseguito). Uso anche un renderizzatore personalizzato per l'elenco a discesa (completato)Imposta sfondo di JComboBox in Swing

Ho controllato il codice sorgente di BasicComboBoxUI e ho provato a sovrascrivere alcuni metodi, ma non succede nulla. Il menu a discesa ha sempre uno sfondo grigio/blu.

Ecco un SSCCE con i miei ultimi tentativi. Ho provato tutto quello che potevo pensare. Per favore dammi un suggerimento, sono perso.

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Graphics; 
import java.awt.Rectangle; 

import javax.swing.BorderFactory; 
import javax.swing.DefaultComboBoxModel; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 
import javax.swing.plaf.basic.BasicComboBoxUI; 

public class DropDownBackground 
{ 
    public static void main(final String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 

      public void run() 
      { 
       final JComboBox dropdown = new JComboBox(new DefaultComboBoxModel(new String[] { "one", "two", "three" })); 
       dropdown.setRenderer(new ComboBoxListCellRenderer()); 
       dropdown.setUI(new BasicComboBoxUI() 
       { 
        @Override 
        public void paint(final Graphics g, final JComponent c) 
        { 

         final Rectangle r = this.rectangleForCurrentValue(); 
         this.paintCurrentValueBackground(g, r, true); 
         this.paintCurrentValue(g, r, true); 

        } 

        @Override 
        public void paintCurrentValueBackground(final Graphics g, final Rectangle bounds, final boolean hasFocus) 
        { 
         final Color t = g.getColor(); 
         if (this.comboBox.isEnabled()) 
          g.setColor(Color.GREEN); 
         else 
          g.setColor(Color.GRAY); 
         g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height); 
         g.setColor(t); 
        } 

        @Override 
        protected JButton createArrowButton() 
        { 
         return new JButton() 
         { 
          @Override 
          public int getWidth() 
          { 
           return 0; 
          } 
         }; 
        } 
       }); 
       dropdown.setBackground(Color.GREEN); 
       final JPanel p = new JPanel(); 
       p.add(dropdown); 

       final JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.getContentPane().add(new JScrollPane(p)); 
       f.setSize(800, 200); 
       f.setLocation(0, 0); 

       f.setVisible(true); 

      } 
     }); 

    } 

    public static class ComboBoxListCellRenderer extends DefaultListCellRenderer 
    { 
     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 

     @Override 
     public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) 
     { 
      this.setToolTipText((String) value); 
      if (isSelected) 
      { 
       this.setBackground(Color.RED); 
       this.setForeground(Color.WHITE); 
      } 
      else 
      { 
       this.setBackground(Color.WHITE); 
       this.setForeground(Color.BLACK); 
      } 

      this.setText((String) value); 
      this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 

      return this; 
     } 
    } 

} 

risposta

7

Da quando ho voluto avere questa applicazione i colori di larghezza, questo è stato l'approccio migliore:

UIManager.put("ComboBox.background", new ColorUIResource(UIManager.getColor("TextField.background"))); 
UIManager.put("ComboBox.foreground", new ColorUIResource(UIManager.getColor("TextField.foreground"))); 
UIManager.put("ComboBox.selectionBackground", new ColorUIResource(Color.GREEN)); 
UIManager.put("ComboBox.selectionForeground", new ColorUIResource(Color.WHITE)); 

Se si desidera personalizzare ancora di più (colori disabili ecc.) questo elenco di proprietà di UIManager potrebbe essere utile: http://www.rgagnon.com/javadetails/JavaUIDefaults.txt

+0

Hai ragione. (+1) – Spiff

0

per cambiare il colore di sfondo JComboBox Mi piacerebbe verificare questa discussione: http://www.coderanch.com/t/555124/GUI/java/JComboBox-background-colour-customer-renderer

EDIT: Per essere onesti, io sono troppo pigro per leggere il codice, ma come su questo? http://www.coderanch.com/t/343835/GUI/java/custom-renderer-JComboBox

sembra essere più orientato renderer :)

+0

Seguendo il collegamento ho trovato alcune informazioni su JComboBox.setEditor(). Ho creato un editor personalizzato e impostato la casella combinata modificabile. Ciò ha funzionato, tuttavia, trovo questa soluzione sbagliata, perché utilizzo un editor non modificabile e devo impostare il ComboBox modificabile, in cui non è in effetti modificabile. È una soluzione rapida per ora, ma un ulteriore aiuto è apprezzato. Le informazioni su un Custom Editor possono essere trovate qui: http://www.coderanch.com/t/333756/GUI/java/creating-custom-ComboBoxEditor – haferblues

+0

controlla la modifica per favore :) –

Problemi correlati