Discussion:
[Swing] wie kann ich die selection background color einer JComboBox verändern
(zu alt für eine Antwort)
Axel Janssen
2003-07-16 11:14:46 UTC
Permalink
Hallo,

lese hier gerade in Manning, Swing 2nd edition bzgl. JComboBox:
class javax.swing.JComboBox
This class represents a basic GUI component which consists of two parts:
- A pop-up menu (an implementation of javax.swing.plaf.basic.ComboPopup). By
default,
this is a JPopupMenu subclass (javax.swing.plaf.basic.BasicCombo-
Popup) that contains a <WICHTIGER_PUNKT>JList in a
JScrollPane</WICHTIGER_PUNKT>.
- A button that acts as a container for an editor or renderer component, and
an arrow button
that is used to display the pop-up menu.


und ein paar Seiten später:
Unfortunately, there is no easy way to access JComboBox's drop-down JList,
which prevents us from assigning new foreground and background colors.
Ideally,
JComboBox would provide this communication with its JList. We hope to see
this functionality in a future version.

Wie kann ich nun die Foreground/Background Colors in einem "auf nicht
einfache Weise" verändern?



Gruß Axel
Tobias Vogele
2003-07-16 11:25:17 UTC
Permalink
Hallo,
Post by Axel Janssen
Unfortunately, there is no easy way to access JComboBox's drop-down JList,
which prevents us from assigning new foreground and background colors.
Ideally,
JComboBox would provide this communication with its JList. We hope to see
this functionality in a future version.
Wie kann ich nun die Foreground/Background Colors in einem "auf nicht
einfache Weise" verändern?
Du kannst Der ComboBox ja einen Renderer mitgeben, was oft eh nötig ist,
wenn man nicht nur Strings oder ähnliches in der ComboBox hat. Und
dieser Renderer muß natürlich nicht die Farben der JList übernehmen,
sondern kann beliebige Farben benutzen.

Oder anders ausgedrückt:
Die Farben der JList sind nur ein höfliches Angebot an den Renderer,
diese zu benutzen. Was letztendlich angezeigt wird, ist allein Aufgabe
des Renderers. Und den kann man mit JComboBox#setRenderer setzen.

Grüße,

tobi
Tobias Vogele
2003-07-16 12:33:40 UTC
Permalink
Hi,
[oops sorry, dass ich aus Versehen per Mail geantwortet habe und nicht an
NG]
Kein Problem. ;-)
Wie verändere ich nun die Farbe des Schiebereglers der JScrollPane, in der
die JList der ComboBox liegt?
Die leuchtet immer noch fröhlich in bissigen Sun-Lila.
Hm, global könntest Du das wahrscheinlich ändern, indem Du per
UIDefaults#put(..) die richtigen Werte setzt, aber wie die heißen, weiß
ich auch nicht auswendig. Du kannst ja mal per
UIManager.getDefaults().keys() alle Schlüssel anschauen und schauen,
welcher passen könnte.

Wie und ob man das spezielle bei JComboBoxes ändern kann, weiß
vielleicht jemand anders besser. ;-)

Grüße,

tobi
Andreas Jaeger
2003-07-16 13:50:17 UTC
Permalink
Hi,
Was sieht denn da nicht gut aus?

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class Test extends JPanel {

Test () {
setLayout(new BorderLayout());
setBorder(new EmptyBorder(250, 250, 250, 250));
JComboBox jcb = new JComboBox(
new String[] {
"Entry 1", "Entry 2", "Entry 3", "Entry 4", "Entry 5",
"Entry 6",
"Entry 7", "Entry 8", "Entry 9", "Entry 10", "Entry
11", "Entry 12",
}
);
add(jcb, BorderLayout.CENTER);
}

public static void main(String[] args) {
UIManager.put("ComboBox.selectionBackground", Color.GREEN);
UIManager.put("ComboBox.selectionForeground", Color.YELLOW);
UIManager.put("ComboBox.buttonBackground", Color.MAGENTA);
UIManager.put("ComboBox.buttonDarkShadow",
Color.ORANGE.darker().darker());
UIManager.put("ComboBox.buttonHighlight", Color.GREEN);
UIManager.put("ComboBox.buttonShadow", Color.ORANGE.darker());
UIManager.put("ScrollBar.thumb", Color.CYAN);
JFrame frame = new JFrame("TemporaryTests");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(new Test (), BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
frame.show();
}

}
--
---------------------------------------------
Andreas Jaeger
http://afi.uni-muenster.de
AFI - Institut für Agrar- und Forstinformatik
an der Universität Münster
---------------------------------------------
Peter Büttner
2003-07-16 16:24:29 UTC
Permalink
Hallo Axel
funktioniert aber gut mit ScrollBar-keys :-) .
Bleibt eine Frage: Kennt jemand den Key für die beiden Pfeile, oben und
unten in der ScrollBar?
Den finde ich nicht.
Quellen runterladen, nachgucken:

...\Doku\Java\jdk1.4.1\Src\javax\swing\plaf\metal\MetalScrollButton.java
...\Doku\Java\jdk1.4.1\Src\javax\swing\plaf\metal\MetalLookAndFeel.java

Wenn es ein anderes L&F sein soll: an den entsprechenden Stellen.
Falls nötig Decompiler verwenden.

Peter
Sascha Broich
2003-07-16 16:35:42 UTC
Permalink
funktioniert aber gut mit ScrollBar-keys :-) .
Bleibt eine Frage: Kennt jemand den Key für die beiden Pfeile, oben und
unten in der ScrollBar?
Den finde ich nicht.
Dazu habe ich folgendes gefunden:

in MetalScrollBarUI gibt es die Methoden
#createDecreaseButton und #createIncreaseButton
die jeweils einen MetalScrollButton extends BasicArrowButton
erzeugen. Und dort wird dann alles händisch im paint gemalt.
--
Sascha Broich
Axel Janssen
2003-07-16 18:06:08 UTC
Permalink
Sag mal, Dir gefällt aber auch nicht viel an der ComboBox, was ;-)?
Wenn man anfängt etwas zu ändern (z.B. den Hintergrund des Balkens) passen
dann die vorhandenen Sachen nicht mehr. :-(
These: Man vermeide als Anwendungsprogrammierer nach Möglichkeit, an
den L&F Sachen herumzudoktern. Das sollen die Graphiker und Ergonomen
machen und halbwegs professionell aufeinander abstimmen, es ist schon
genug Arbeit, die tatsächliche Anordnung der UI Komponenten und deren
Funktionalität in der Anwendung zu programmieren.
tendiere dazu, dir zuzustimmen.
Danke für die vielen guten Beiträge.

Axel

Loading...