Swing Focus von JComboBox entfernen, ohne einem anderen Feld den Focus zuzuweisen

Nachtschicht

Mitglied
Hallo zusammen,

ich stehe gerade wieder vor einem kleinen Problem.
Für eine JComboBox habe ich einen ItemListener gebaut, der bei Auswahl eines Items anhand dessen die Hintergrundfarbe der JComboBox ändert.
Das funktioniert nach einigem Hin- und Herprobieren auch soweit gut, nur ein Problem bleibt:
Nach der Auswahl hat die JComboBox den Focus und statt der neu zugewiesenen Hintergrundfarbe hat das Feld die blau-graue Farbe eines ausgewählten Items.

Das ist nur ein kleiner Schönheitsfehler, mit dem ich notfalls auch leben kann, aber wenn es eine unkomplizierte Lösung dafür gibt, wäre es nett, das Problem loszuwerden.
Ich möchte nicht unbedingt irgendeinem anderen Feld den Focus geben, das fände ich irgendwie unsauber und auch etwas verwirrend.
Ich habe auch überlegt, ob ich den Focus an irgendein Dummy-Element loswerden kann, das nicht sichtbar darauf reagiert, wenn da jemand einen Tip hat, was man dafür nehmen kann, her damit.
 

Robert Zenz

Top Contributor
Du hast da noch ein anders beziehungsweises zusaetzliches Problem: Das Look and Feel. Je nach LaF kann das setzen einer Hintergrundfarbe funktionieren oder nicht. Das GTK-LaF zum Beispiel ignoriert sehr gerne gesetzte Hintergrundfarben weil sowas in GTK einfach nicht vorgesehen ist. Und ob und wann die gesetzte Hintergrundfarbe gezeichnet wird ist auch wieder vom LaF abhaengig.

Eine Alternative die ueberall funktioniert waere zum Beispiel die Farbe in einem eigenen Feld neben dem Auswahlfeld anzuzeigen, also von einer JComponent ableiten und dann die Hintergrundfarbe auf sich selbst fuellend zeichnen sollte reichen. Eine andere Moeglichkeit waere das LaF fix vorzugeben und dann eine darauf angepasste Loesung zu machen. Viele LaFs erlauben es Farben zu ueberschreiben oder umzusetzen zur Laufzeit, aber das haengt vom LaF ab.
 

Nachtschicht

Mitglied
Du hast da noch ein anders beziehungsweises zusaetzliches Problem: Das Look and Feel. Je nach LaF kann das setzen einer Hintergrundfarbe funktionieren oder nicht. Das GTK-LaF zum Beispiel ignoriert sehr gerne gesetzte Hintergrundfarben weil sowas in GTK einfach nicht vorgesehen ist. Und ob und wann die gesetzte Hintergrundfarbe gezeichnet wird ist auch wieder vom LaF abhaengig.

Eine Alternative die ueberall funktioniert waere zum Beispiel die Farbe in einem eigenen Feld neben dem Auswahlfeld anzuzeigen, also von einer JComponent ableiten und dann die Hintergrundfarbe auf sich selbst fuellend zeichnen sollte reichen. Eine andere Moeglichkeit waere das LaF fix vorzugeben und dann eine darauf angepasste Loesung zu machen. Viele LaFs erlauben es Farben zu ueberschreiben oder umzusetzen zur Laufzeit, aber das haengt vom LaF ab.

Das ist eine interessante Info... das hieße, auch wenn es jetzt funktioniert, tut es das evtl. nicht mehr, wenn Microsoft da mal wieder was ändert?

Über andere Betriebssysteme muß ich mir im Moment noch keine Gedanken machen, mein Tool wird nur Firmenintern eingesetzt werden und da ändert sich nicht so leicht das benutzte System. Gibt es irgendwo sowas wie eine Übersicht gängiger LaF und der Unterschiede in deren Verhalten?

So sieht das ganze im Moment aus, der Hintergrund für das Textfeld der ComboBox war ein bischen tricky:

JComboBox_Farbe.jpg

Ohne Auswahl -> direkt nach Auswahl -> ohne Focus -> ohne Focus geöffnet

Daß der Hintergrund der gesamten Auswahlliste auch grün ist, ist eigentlich nicht nötig, stört aber auch nicht.

Und hier noch der Code dazu:
Java:
cbSegment = new JComboBox<Shop>(Shop.values());
        cbSegment.setBounds(10, 75, 80, 20);
        cbSegment.setEditable(false);
//Dieser Teil prüft, ob überhaupt ein Datensatz im Dialog zu sehen ist und ermittelt und setzt die Farbe, wenn das der Fall ist
        if(UP==null)
            cbSegment.setSelectedIndex(-1);
        else
            cbSegment.setSelectedItem(UP.getUnterabteilung());
        Shop selectedShop = (Shop)cbSegment.getSelectedItem();
        JComponent comp = (JComponent)cbSegment.getEditor().getEditorComponent();
        comp.setBackground(selectedShop==null?Color.WHITE:Color.decode(TSM_Kapazitaetsplanung.hmFarben.get(selectedShop.Kurzname())));      

        cbSegment.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if(e.getStateChange() == ItemEvent.SELECTED){
                    JComboBox localCombo = (JComboBox)e.getSource();
                    setCBBackground(localCombo);                    
                }              
            }
        });



    private void setCBBackground(JComboBox argCombo) {  
        // die Farbe wird aus einer HashMap anhand eines Wertes im enum Shop ermittelt
        Shop selectedShop = (Shop)argCombo.getSelectedItem();
        argCombo.setBackground(Color.decode(TSM_Kapazitaetsplanung.hmFarben.get(selectedShop.Kurzname())));
        JComponent comp = (JComponent)argCombo.getEditor().getEditorComponent();
        comp.setBackground(Color.decode(TSM_Kapazitaetsplanung.hmFarben.get(selectedShop.Kurzname())));
    }

    private void setCBBackground(JComboBox argCombo) {  
        // zur Übersichtlichkeit nochmal der wesentliche Teil ohne die Ermittlung der Farbe
       
        argCombo.setBackground(Color.MeineFarbe); //wird trotz des comp.setBacground(...) gebraucht, sonst wird keine Hintergrundfarbe sichtbar
        JComponent comp = (JComponent)argCombo.getEditor().getEditorComponent();
        comp.setBackground(Color.MeineFarbe); //wird für die Hintergrundfarbe des Textfeldes gebraucht
    }
 

Robert Zenz

Top Contributor
Also du verwendest das Metal LaF, was so ziemlich der Standard ist. Das kannst du auch in deiner Applikation setzen unabhaengig davon wie das System konfiguriert ist.

Das gesagt, die einfachste Variante wird vermutlich werden die LaF Klasse selbst zu erweitern, in dem Fall waere es die MetalComboBoxUI, beim zeichnen der Komponente zieht diese die Farbe fuer den selektierten Hintergrund aus einer JList-Klasse.

Ein ganz, ganz, ganz kruder Beweis dass man das umsetzen kann waere dies:

Java:
comboBox.setUI(new MetalComboBoxUI() {
    @Override
    public void paint(Graphics g, JComponent c) {
        listBox.setSelectionBackground(Color.RED);
        
        super.paint(g, c);
    }
});

Muesste man natuerlich aufarbeiten und schoener gestalten. Am besten in den Faellen ist immer wenn man direkt den Quellcoder der LaF-Klassen liest und schaut wo die sich die Eigenschaften herholen.
 

Nachtschicht

Mitglied
Also du verwendest das Metal LaF, was so ziemlich der Standard ist. Das kannst du auch in deiner Applikation setzen unabhaengig davon wie das System konfiguriert ist.

Das gesagt, die einfachste Variante wird vermutlich werden die LaF Klasse selbst zu erweitern, in dem Fall waere es die MetalComboBoxUI, beim zeichnen der Komponente zieht diese die Farbe fuer den selektierten Hintergrund aus einer JList-Klasse.

Ein ganz, ganz, ganz kruder Beweis dass man das umsetzen kann waere dies:

Java:
comboBox.setUI(new MetalComboBoxUI() {
    @Override
    public void paint(Graphics g, JComponent c) {
        listBox.setSelectionBackground(Color.RED);
       
        super.paint(g, c);
    }
});

Muesste man natuerlich aufarbeiten und schoener gestalten. Am besten in den Faellen ist immer wenn man direkt den Quellcoder der LaF-Klassen liest und schaut wo die sich die Eigenschaften herholen.
Danke, das hört sich gut an, dann wäre ich zumindest größtenteils sicher, daß mein UI weiterhin so aussieht, wie ich es programmiert habe, wenn auch vielleicht etwas "altbacken".
Vielleicht bekomme ich ja so auch meine Farbwünsche erfüllt 😅

P.S.: Habs direkt mal getestet und als Versuch mal das System LaF eingestellt. Die Unterschiede sind gar nicht mal so verheerend, wie ich befürchtet habe, bis auf ein paar Kleinigkeiten paßt alles.
Eine der Kleinigkeiten, die nicht funktioniert, ist genau diese JComboBox-Hintergrundfarbe, da bleibt alles grau.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Focus auf titledborder AWT, Swing, JavaFX & SWT 8
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
xYurisha Gui Focus von JTextField weglenken AWT, Swing, JavaFX & SWT 6
O Focus zwischen Chat und Spiel wechselns AWT, Swing, JavaFX & SWT 3
T bekomme keinen Focus auf JTextField AWT, Swing, JavaFX & SWT 3
fLooojava JButton [Focus) AWT, Swing, JavaFX & SWT 4
K JavaFX Focus Listener für gesamte Scene AWT, Swing, JavaFX & SWT 1
C JOptionPane.showConfirmDialog() -> Focus auf NEIN -> Enter gibt YES_OPTION zurück AWT, Swing, JavaFX & SWT 6
T SWT Button soll nur sichbar sein,wenn im Textfeld der Focus ist AWT, Swing, JavaFX & SWT 4
B Swing JTextfeld bekommt nur jedes Zweite mal Focus AWT, Swing, JavaFX & SWT 11
E JTextPane Focus AWT, Swing, JavaFX & SWT 1
D ComboBoxCellEditor Refresh beim Focus AWT, Swing, JavaFX & SWT 4
A Swing Focus der Radio Buttons + text bleibt gleich und gleichzeitige ausgabe zweier Objekte in 1. Fenster AWT, Swing, JavaFX & SWT 3
A Focus Problem AWT, Swing, JavaFX & SWT 4
I focus an ein jdialog geben AWT, Swing, JavaFX & SWT 3
B JInternalFrame Focus setzten geht nicht AWT, Swing, JavaFX & SWT 2
A Swing Focus auf gemalte Component AWT, Swing, JavaFX & SWT 5
H Swing JTextField in JWindow, JWindow bekommt focus zurück? AWT, Swing, JavaFX & SWT 9
M Swing Focus für Buttons deaktiviert --> keine Reaktion mehr auf Tastendrücke AWT, Swing, JavaFX & SWT 5
M focus subFrame AWT, Swing, JavaFX & SWT 3
G Force Focus für JButton AWT, Swing, JavaFX & SWT 2
lumo SWT Composite Focus AWT, Swing, JavaFX & SWT 2
T disabled Checkbox soll trotzdem Focus bekommen AWT, Swing, JavaFX & SWT 9
C Swing Focus Management AWT, Swing, JavaFX & SWT 3
lumo SWT Table Selection Color +Focus Out AWT, Swing, JavaFX & SWT 14
H Swing Focus bekommen AWT, Swing, JavaFX & SWT 4
D Swing keine Tabellen Zeilen ohne Focus AWT, Swing, JavaFX & SWT 7
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
L AWT Focus auf Fenster setzen AWT, Swing, JavaFX & SWT 4
H warum kann ich das focus event nicht abfangen ? AWT, Swing, JavaFX & SWT 5
L Swing Input Focus eines JTextFields in einer JList AWT, Swing, JavaFX & SWT 2
A Focus in JTable Cell AWT, Swing, JavaFX & SWT 3
A Focus für JApplet AWT, Swing, JavaFX & SWT 7
R Focus ermitteln AWT, Swing, JavaFX & SWT 2
C JTable Focus Handling AWT, Swing, JavaFX & SWT 2
Nitram Swing Focus im JFrame AWT, Swing, JavaFX & SWT 10
I Swing Focus Listener bei PComboBox von pswing Erweiterung AWT, Swing, JavaFX & SWT 7
V Swing Problem mit Focus setzen AWT, Swing, JavaFX & SWT 7
thE_29 Swing JTabbedPane Focus von Komponenten außerhalb AWT, Swing, JavaFX & SWT 10
B JTable getselectedrow liefert -1 wenn Focus verloren AWT, Swing, JavaFX & SWT 4
S Versuch den Focus zu klauen detektieren? AWT, Swing, JavaFX & SWT 14
SebSnake JFrame "Focus" erzwingen (wie JOptionPane) AWT, Swing, JavaFX & SWT 3
V JTabbedPane - keine "Focus"-Box auf selektiertem T AWT, Swing, JavaFX & SWT 2
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2
O Focus im GBL steuern. AWT, Swing, JavaFX & SWT 3
K Focus an das JPanel übergeben AWT, Swing, JavaFX & SWT 2
K Focus-Problem AWT, Swing, JavaFX & SWT 9
O TextBoxen Focus über Pfeiltasten steuern AWT, Swing, JavaFX & SWT 3
G Problene mt Focus unter Swing AWT, Swing, JavaFX & SWT 7
G JTable und Focus AWT, Swing, JavaFX & SWT 30
D Beim Starten ein JTextfield Focus geben AWT, Swing, JavaFX & SWT 7
J JTextPane bekommt keinen Focus! AWT, Swing, JavaFX & SWT 3
P TextFeld Focus entfernen AWT, Swing, JavaFX & SWT 2
F Problem mit Actions, TextComponents und Focus AWT, Swing, JavaFX & SWT 2
K Focus mit Mouseclick auf JPanel setzen AWT, Swing, JavaFX & SWT 4
D Focus auf JPanel setzen AWT, Swing, JavaFX & SWT 2
B JTable - Focus - TabTaste AWT, Swing, JavaFX & SWT 2
D Focus in bestimmter Celle in JTable AWT, Swing, JavaFX & SWT 3
B Komponente in JTable bekommt keinen Focus AWT, Swing, JavaFX & SWT 3
M Focus beim öffnen eines neuen JFrames AWT, Swing, JavaFX & SWT 6
O JTextField- Selection / Focus bei nicht editierbaren Feldern AWT, Swing, JavaFX & SWT 2
J Focus auf JFrame AWT, Swing, JavaFX & SWT 3
B Focus für Textfeld AWT, Swing, JavaFX & SWT 5
B im JTree Focus setzen und navigieren AWT, Swing, JavaFX & SWT 3
B JInternalFrame in den Vordergrund rücken + Focus AWT, Swing, JavaFX & SWT 15
D JTable: Focus auf Zelle markiert ihren Text zum editieren AWT, Swing, JavaFX & SWT 2
C Komponente mit Focus bevor JButton-Klick merken. AWT, Swing, JavaFX & SWT 6
L Focus setzen AWT, Swing, JavaFX & SWT 3
G JTabbedPane, Focus, ChangeListener AWT, Swing, JavaFX & SWT 1
B Focus in JOptionPane AWT, Swing, JavaFX & SWT 2
J Focus-Problem bei Vollbildmodus AWT, Swing, JavaFX & SWT 7
A Combobox Focus-Events, Tab in Tabelle AWT, Swing, JavaFX & SWT 7
F Fenster in den Vordergrund aber nicht im Focus AWT, Swing, JavaFX & SWT 21
O Abfrage ob eine bstimmte Komponente den Focus hat AWT, Swing, JavaFX & SWT 4
T JTable Focus auf Zelle setzen AWT, Swing, JavaFX & SWT 3
R Focus durch "tabben" von JTable Zelle auf andere K AWT, Swing, JavaFX & SWT 8
R Focus speeren AWT, Swing, JavaFX & SWT 2
K JList - merkwürdiges Verhalten bei Leertaste (unter Focus) AWT, Swing, JavaFX & SWT 7
W Components Focus mit TAB-Taste VERTIKAL bewegen AWT, Swing, JavaFX & SWT 4
V JTextField Focus Cursor setzen AWT, Swing, JavaFX & SWT 2
D jcolorchooser - lost focus AWT, Swing, JavaFX & SWT 2
R Focus auf bereits geöffnetes Fenster setzen AWT, Swing, JavaFX & SWT 9
O Welche Möglichkeit zum Focus setzen! AWT, Swing, JavaFX & SWT 2
R JMenu copy Focus-Problem AWT, Swing, JavaFX & SWT 2
M Focus einstellen AWT, Swing, JavaFX & SWT 3
G Focus so setzen, daß in einer jTextArea der Cursor blinkt AWT, Swing, JavaFX & SWT 7
G JTable: Rahmen bei Focus um Zelle AWT, Swing, JavaFX & SWT 2
thE_29 Modaler Dialog - close on not focus AWT, Swing, JavaFX & SWT 3
P Focus auf JFrame AWT, Swing, JavaFX & SWT 5
G JOptionPane verliert Focus AWT, Swing, JavaFX & SWT 3
A JTree Problem mit Focus bzw. Selection AWT, Swing, JavaFX & SWT 5
C Focus setzen AWT, Swing, JavaFX & SWT 2
G JTree Focus setzen AWT, Swing, JavaFX & SWT 2
F HILFE!!! Focus-Probleme bei unterschiedlichen Panel's AWT, Swing, JavaFX & SWT 3
hannibalstgt Fehler bei JCOMBOBOX GUI Anzeige AWT, Swing, JavaFX & SWT 4
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
R JComboBox abfragen AWT, Swing, JavaFX & SWT 1
Esquid If Befehl bei JComboBox AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben