2013-01-15 16 views
5

Chcę JComboBox bez przycisku strzałki (gotowe), który ma zielone tło, gdy jest włączony i szare tło, gdy wyłączona (nie zrobione). Używam również niestandardowego mechanizmu renderowania dla rozwijanej listy (gotowe)Ustaw tło JComboBox w Swing

Sprawdziłem kod źródłowy BasicComboBoxUI i próbowałem przesłonić niektóre metody, ale nic się nie dzieje. Lista rozwijana ma zawsze szare/niebieskie tło.

Oto SSCCE z moimi ostatnimi próbami. Próbowałem wszystkiego, co mogłem wymyślić. Proszę, daj mi podpowiedź, jestem zagubiony.

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

} 

Odpowiedz

7

Ponieważ chciałem mieć tę aplikację kolory szeroki, to było najlepsze podejście:

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

Jeśli chcesz dostosować nawet więcej (kolory niepełnosprawnych itp.) ta lista właściwości UIManager może być przydatna: http://www.rgagnon.com/javadetails/JavaUIDefaults.txt

+0

Masz rację. (+1) – Spiff

0

na zmianę koloru tła JComboBox bym sprawdzić ten wątek: http://www.coderanch.com/t/555124/GUI/java/JComboBox-background-colour-customer-renderer

EDIT: Szczerze mówiąc, jestem zbyt leniwy, aby odczytać kod, ale jak o tym? http://www.coderanch.com/t/343835/GUI/java/custom-renderer-JComboBox

wydaje się być bardziej zorientowane renderujący :)

+0

Po tym łączu znalazłem informacje o JComboBox.setEditor(). Stworzyłem niestandardowy edytor i ustawiłem pole kombi do edycji. To działało, ale uważam to za złe rozwiązanie, ponieważ używam edytora, który nie jest edytowalny i muszę ustawić Edycję ComboBox, gdzie w rzeczywistości nie można go edytować. Jest to szybkie rozwiązanie na razie, ale dalsza pomoc jest doceniana. Informacje o edytorze niestandardowym można znaleźć tutaj: http://www.coderanch.com/t/333756/GUI/java/creating-custom-ComboBoxEditor – haferblues

+0

sprawdź edytuj proszę :) –