Combobox zur Farbwahl kollidiert mit NimbusLookAndFeel

Status
Nicht offen für weitere Antworten.

SuperSeppel13

Bekanntes Mitglied
Hallo Leute,
ich arbeite gerade an einem kleinen Projekt, in dem ich eine JComboBox zum wählen einer Zeichenfarbe verwende.
Dazu habe ich auf www.demo2s.com ein nettes Beispiel gefunden und dies für meine Zwecke leicht modifiziert.
Ich habe also eine Klasse "ColorRenderer" geschrieben, die folgendermaßen aussieht:
Code:
class ColorRenderer extends JPanel implements ListCellRenderer{

    protected Color sc = Color.BLACK;

    public ColorRenderer(){
        super();
        setBorder(new CompoundBorder(new MatteBorder(2, 4, 2, 4, Color.WHITE), new LineBorder(Color.BLACK)));
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){
        if(value instanceof Color)
            sc = (Color)value;
        
        return this;
    }

    @Override
    public void paint(Graphics g){
        setBackground(sc);
        super.paint(g);
    }

}
Diese verwende ich nun als ListCellRenderer für besagte ComboBox, was unter normalen Bedingungen auch funktioniert.

Nun möchte ich jedoch gerne das NimbusLookAndFeel (in com.sun.java.swing.plaf.nimbus) verwenden, da ich dieses wesentlich ansprechender finde als das Standard-LookAndFeel von Swing.
Das führt nur leider dazu, dass in der ComboBox die gewählt Farbe nicht richtig angezeigt wird. In der Liste sind die Farben zwar alle korrekt dargestellt, aber wenn ich dann eine auswähle, erscheint das Feld in der ComboBox immer nur grau. :bahnhof:

Gibt es eine Möglichkeit dies zu beheben?
Ich bin eigentlich noch Anfänger, fand die Frage aber etwas zu speziell für den Anfängerbereich.

Hier nochmal ein KSKB zur veranschaulichung:

Code:
/**
 *
 * @author SuperSeppel13
 */

import javax.swing.*;
import java.awt.*;
import javax.swing.border.*;
import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;



public class ColorComboBox extends JFrame{
    
    JComboBox com;
    
    public ColorComboBox(){
        setSize(150, 80);
        setLayout(new FlowLayout(FlowLayout.CENTER));
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        com = new JComboBox();
        com.setEditable(false);
        com.setPreferredSize(new Dimension(100, 25));
        com.addItem(Color.BLUE);
        com.addItem(Color.BLACK);
        com.addItem(Color.RED);
        com.addItem(Color.GREEN);
        com.setRenderer(new ColorRenderer());
        
        
        add(com);

    }
    
    public static void main(String[] args){
//        try{
//            UIManager.setLookAndFeel(new NimbusLookAndFeel());
//        }catch(Exception e){System.out.println(e);}

        ColorComboBox ccb = new ColorComboBox();
        ccb.setVisible(true);
    }

}


class ColorRenderer extends JPanel implements ListCellRenderer{

    protected Color sc = Color.BLACK;

    public ColorRenderer(){
        super();
        setBorder(new CompoundBorder(new MatteBorder(2, 4, 2, 4, Color.WHITE), new LineBorder(Color.BLACK)));
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){
        if(value instanceof Color)
            sc = (Color)value;
        
        return this;
    }

    @Override
    public void paint(Graphics g){
        setBackground(sc);
        super.paint(g);
    }

}
Wenn man die drei Zeilen mit 'setLookAndFeel' usw wieder einbezieht geht's nicht mehr! :cry:
 

Marco13

Top Contributor
Hm - konnt's hier jetzt gerade nicht testen, aber diese Renderer-Implementierung sieht seltsam aus... eigentlich hätte ich da jetzt eher sowas gemacht wie
Code:
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){
        if(value instanceof Color)
        {
            sc = (Color)value;
            setBackground(sc);
        }
        return this;
    }

    /* WEG:
    @Override
    public void paint(Graphics g){
        setBackground(sc);
        super.paint(g);
    } 
    */
Weiß nicht genau, ob's einen Unterschied macht, wenn nicht, muss man nochmal schauen....
 

SuperSeppel13

Bekanntes Mitglied
Hm, eigentlich keine schlechte Idee, führt nur leider dazu, dass das gleiche Problem auch mit Standard-LookAndFeel auftaucht, dass also nicht die ausgewählte Farbe, sondern immer nur grau angezeigt wird (warum, kann ich mir auch nicht erklären).
 

Marco13

Top Contributor
Ist jeztz auch nur ein Tipp, aber im Konstruktor des Renderers mal
setOpaque(true);
aufzurufen könnte auch helfen - wenn nicht muss ich wohl mal das neueste JDK installieren und es mit Nimbus testen...
 

Marco13

Top Contributor
Hm - das Ändern des LnF für eine einzelne Komponente wäre nicht so schön. Irgendwie scheint's da grundsätzlich... "Probleme" oder zumindest Interpretationsschwierigkeiten mit Nimbus Backgrounds, Opacity, Styles und Farben zu geben (siehe z.B. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6687960 und viele andere Bugs und Threads). Hab' jetzt ne knappe Stunde versucht, da "DIE" Lösung dafür zu finden. Dabei über solche Sachen im Nimbus-Quellcode zu stolpern
//there is one odd case that needs to be supported here: cell
//renderers.
[...]
//Likewise, we have a hacked work around for cellRenderer, renderer,
//and listRenderer.
machen nicht gerade Mut, dass es dafür eine nicht-gehackte Lösung gibt, die tatsächlich auf die Background-Color zurückgreift. (Das Graue Rechteck ist übrigens die Hintergrundfarbe der JList - mit einem tollen, tollen "Ausblendeffek" drüber :roll: ).

Also, ich würde jetzt einfach die Background-Farbe Background-Farbe sein lassen, und malen, was ich will - und wenn man ein farbiges Rechteck haben will, dann malt man eben ein farbiges Rechteck, und fertig.
Code:
class ColorRenderer extends JPanel implements ListCellRenderer{

    protected Color sc = Color.BLACK;

    public ColorRenderer(){
        super();
        setBorder(new CompoundBorder(new MatteBorder(2, 4, 2, 4, Color.WHITE), new LineBorder(Color.BLACK)));
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){
        if(value instanceof Color)
        {
            sc = (Color)value;
        }
        return this;
    }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(sc);
        g.fillRect(0,0,getWidth(),getHeight());
    }

}

Man könnte auch ganz frech behaupten: DAS ist DIE richtige Lösung, und das Codestück von java2s war nur ein Hack, der "zufällig, bei den meisten L&Fs funktioniert" :p :wink:
 

SuperSeppel13

Bekanntes Mitglied
Also ich würd sagen, das ist absolut DIE richtige lösung - funktioniert perfekt!
Hab noch den ursprünglichen Rahmen wieder dazugezeichnet. Sieht jetzt toll aus!
Ganz dickes 'Dankeschön'!

PS: Also, sowas im Nimbus-Quelltext zu finden hätte mir auch angst gemacht! :wink:
 

Marco13

Top Contributor
Hab' gerade mal ge"grep"t: Der Java 6u11 Quellcode enthält 38 mal ein "FIXME" und 79 mal das Wort "hack" - beruhigenderweise manchmal nur in Referenzen auf ein Buch(?) namens "Hacker's Delight", aber "beunruhigender"weise auch einmal in einem Variablennamen :shock: Aber seit http://www.javaspecialists.eu/archive/Issue077.html wissen wir ja: Only a real developer would write "hack" into his comments. :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Element aus comboBox mit observableList löschen AWT, Swing, JavaFX & SWT 3
T Combobox mit Autocomplete-Funktion AWT, Swing, JavaFX & SWT 7
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
N Promt Text der Combobox AWT, Swing, JavaFX & SWT 0
Doppel JavaFX ComboBox AWT, Swing, JavaFX & SWT 5
P JavaFX ClassCastException bei ComboBox.getValue AWT, Swing, JavaFX & SWT 4
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
L JavaFX Wiederspenstige ComboBox AWT, Swing, JavaFX & SWT 0
P Combobox und Enum AWT, Swing, JavaFX & SWT 3
L ComboBox Wert automatisch auswählen AWT, Swing, JavaFX & SWT 6
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
K Nullpointer Combobox Listener AWT, Swing, JavaFX & SWT 2
K JavaFX Combobox, Textfield & setOnMouseClicked AWT, Swing, JavaFX & SWT 2
it_is_all Swing Button, ComboBox,... -- Unterschied: NetBeans Design <-> Ausführung AWT, Swing, JavaFX & SWT 2
D JavaFX ComboBox String setzen AWT, Swing, JavaFX & SWT 20
offi Combobox in TableCell AWT, Swing, JavaFX & SWT 1
D Javafx Combobox Abfrage aus mysql AWT, Swing, JavaFX & SWT 8
K Event Handling ComboBox Event Handler AWT, Swing, JavaFX & SWT 7
MrSnake ComboBox-Einträge werden unsichtbar AWT, Swing, JavaFX & SWT 0
L ComboBox: slider positionieren AWT, Swing, JavaFX & SWT 0
M JavaFX ComboBox: Update zur Laufzeit AWT, Swing, JavaFX & SWT 16
M JavaFX Combobox bindBidirectional AWT, Swing, JavaFX & SWT 4
D [Anfänger]ComboBox erstellt Einträge in einer anderen ComboBox AWT, Swing, JavaFX & SWT 3
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
H Combobox aktualisieren AWT, Swing, JavaFX & SWT 2
G Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens AWT, Swing, JavaFX & SWT 3
M JavaFX ComboBox AWT, Swing, JavaFX & SWT 5
T Problem: ComboBox und addItem AWT, Swing, JavaFX & SWT 5
J ComboBox als Filter benutzen AWT, Swing, JavaFX & SWT 1
M ausgewählte Inhalt von ListItem inn ComboBox in der Tabelle speichern AWT, Swing, JavaFX & SWT 0
Developer_X Java JTable - Combobox + Checkbox - Cellrenderer + Editor AWT, Swing, JavaFX & SWT 3
G Dynamische ComboBox AWT, Swing, JavaFX & SWT 3
U Combobox mit individuellen Texten AWT, Swing, JavaFX & SWT 5
M JavaFX Combobox - Item Auswahl mit Tasten AWT, Swing, JavaFX & SWT 8
F JavaFX Daten aus Tabelle in ComboBox AWT, Swing, JavaFX & SWT 9
C Beschriftungen von Tabellenspalten mit Combobox aussuchen AWT, Swing, JavaFX & SWT 2
G JavaFX ComboBox .getItems().add() Problem AWT, Swing, JavaFX & SWT 9
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
F SWT Problem mit Tabelle und Combobox in einem Wizard AWT, Swing, JavaFX & SWT 5
B JAVAFX icon in ComboBox einfügen AWT, Swing, JavaFX & SWT 5
W Swing Combobox Abhängigkeit AWT, Swing, JavaFX & SWT 1
S ComboBox-Werte aus einem Array an Textfields übergeben AWT, Swing, JavaFX & SWT 3
A Swing GUI mit ComboBox, wenn Item ausgewählt wurde neues GUI AWT, Swing, JavaFX & SWT 7
S Combobox aktualisieren AWT, Swing, JavaFX & SWT 3
B Erstellen eigener Combobox ("CellFactory") AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
A combobox automatisch in ein textfeld wechseln AWT, Swing, JavaFX & SWT 3
J Swing Drive-ComboBox AWT, Swing, JavaFX & SWT 7
C TextFeld in Verbindung zur ComboBox automatisch aktualisieren AWT, Swing, JavaFX & SWT 7
L Swing Model für ComboBox AWT, Swing, JavaFX & SWT 14
H Combobox in einer einzelnen Zelle der Jtable AWT, Swing, JavaFX & SWT 2
T Java Combobox Problem AWT, Swing, JavaFX & SWT 3
C SWT Combobox mit Textdatei füllen AWT, Swing, JavaFX & SWT 2
M comboBox Listener? AWT, Swing, JavaFX & SWT 2
R Datenbanktabellen in Combobox AWT, Swing, JavaFX & SWT 3
C Combobox bei Tabellenänderung mit aktualisieren AWT, Swing, JavaFX & SWT 11
1 CellEditor mit ComboBox richtig beenden AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
E Swing CellEditor mit Combobox durch Tastatureingabe editieren?! AWT, Swing, JavaFX & SWT 3
GianaSisters Swing ComboBox im jTable (in bestimmter Zelle nicht über die ganze Spalte) AWT, Swing, JavaFX & SWT 4
T Daten mittels ComboBox in ein JTable adden AWT, Swing, JavaFX & SWT 7
N Filternde Combobox in JTable verliert Fokus nach erster Eingabe AWT, Swing, JavaFX & SWT 2
F Wert zu Eintrag in ComboBox speichern?! AWT, Swing, JavaFX & SWT 7
P Swing ComboBox(en) in JTable auslesen und ausgeben AWT, Swing, JavaFX & SWT 11
M Index von Combobox AWT, Swing, JavaFX & SWT 20
L ComboBox in Action AWT, Swing, JavaFX & SWT 4
D ComboBox & CellListRenderer AWT, Swing, JavaFX & SWT 6
D ComboBox-Model mit Observer AWT, Swing, JavaFX & SWT 3
B Taschenrechner mit ComboBox AWT, Swing, JavaFX & SWT 7
T ComboBox auslesen AWT, Swing, JavaFX & SWT 11
P Combobox liesst falschen Wert AWT, Swing, JavaFX & SWT 10
C Combobox im JFrame aus Datenbank befüllen AWT, Swing, JavaFX & SWT 6
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
M Swing ComboBox ein SelectedItem übergeben/anzeigen AWT, Swing, JavaFX & SWT 7
J Werte aus Combobox speichern AWT, Swing, JavaFX & SWT 3
J Combobox als Filterkriterium (Gruppierung) in JTable AWT, Swing, JavaFX & SWT 7
R Swing ComboBox und doppelter Event!? AWT, Swing, JavaFX & SWT 10
M SWT Wie Textfeld hinzufügen, nach Auswahl von einem bestimmten Combobox-item? AWT, Swing, JavaFX & SWT 3
M SWT ComboBox mit DB-Inhalten Designfrage AWT, Swing, JavaFX & SWT 5
W MouseListener im editable ComboBox AWT, Swing, JavaFX & SWT 14
W Combobox mit eingabefeld AWT, Swing, JavaFX & SWT 7
T Editable ComboBox / kein Weiterspringen AWT, Swing, JavaFX & SWT 12
M Combobox in JTable AWT, Swing, JavaFX & SWT 4
S Swing ComboBox aus Array befüllen AWT, Swing, JavaFX & SWT 2
K Per ComboBox Dateien einlesen AWT, Swing, JavaFX & SWT 23
0 Hintergundfarbe von editierbarer ComboBox ändern AWT, Swing, JavaFX & SWT 2
M Frage zu ComboBox AWT, Swing, JavaFX & SWT 7
O Bitte um Hilfe bei ComboBox in TableHeader AWT, Swing, JavaFX & SWT 9
A NetBeans und ComboBox AWT, Swing, JavaFX & SWT 2
D ComboBox(Model) mit dummyItem AWT, Swing, JavaFX & SWT 10
D Inhalt von Textfield nach ComboBox AWT, Swing, JavaFX & SWT 2
GilbertGrape nochmal editierbare Combobox AWT, Swing, JavaFX & SWT 3
GilbertGrape JTable mit Combobox-Editierung schon nach einem Klick AWT, Swing, JavaFX & SWT 7
E Swing Button ActionListener Infos aus Textfield und ComboBox AWT, Swing, JavaFX & SWT 3
G ComboBox wird nicht angezeigt beim anhängen an eine Gruppe AWT, Swing, JavaFX & SWT 2
G Combobox Event AWT, Swing, JavaFX & SWT 4
G ComboBox aktualisieren AWT, Swing, JavaFX & SWT 13
C Binding eines EntityBean als SelectionInList in ComboBox AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben