# pull down button einer jComboBox modifizieren



## berny76 (8. Mrz 2008)

Hallo,

nach 30 Minuten Recherche ohne den geringsten Ansatz für mein Problem zu finden, nun ein neuer thread dazu:

Ich hätte gern den pull down button einer jComboBox verändert; nämlich breiter gemacht. Übersehe ich da was bei der API oder ist das so speziell, dass man das komplett anders anfassen muss? Falls ja, dann wie?

Hintergrund: Bei einer jComboBox-Breite von ~800 Pixel und 40er Schriftgröße wird der vorgegebene pull down button förmlich zum Streichholz  :roll:


----------



## L-ectron-X (8. Mrz 2008)

Sowas?
http://www.crionics.com/products/opensource/faq/swing_ex/JComboBoxExamples1.html

Erstes Beispiel.


----------



## berny76 (9. Mrz 2008)

Hm... nein, überhaupt nicht. Habe ich mich denn so ungeschickt ausgedrückt?  ???:L  sorry

Ich will den Button zum Aufklappen der Liste verändern. Hier mal ein Bild, worum es geht:







Der Button zum aufziehen der Liste ist schmal wie ein Streichholz. Den hätte ich gerne verbreitert.


----------



## berny76 (9. Mrz 2008)

Da das Bild hier im Forum nicht angezeigt wird, zur Sicherheit noch einmal nen Link dazu:
www.pictureupload.de/pictures/090308105909_jcombobox.jpg


----------



## PELLE (9. Mrz 2008)

http://search.sun.com/search/onesea...ubcat=siteforumid:java57&col=developer-forums

da wirst du fündig werden!


----------



## berny76 (9. Mrz 2008)

Puuuh... Habe da jetzt 15 Seiten durchgearbeitet. So ganz wurde ich aber nicht fündig. Selten nur ging es um mein Problem. Und wenn, dann liefen die threads meist tot.

Aber eins habe ich herausbekommen. Zum Zeichnen des Buttons einer JComboBox wird die Klasse BasicArrowButton eingesetzt. Eine Instanz dieser Klasse habe ich nach weiterer Recherche auch auf ein Panel setzen und vergrößern können. Hier mal der Code dazu:


```
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.ButtonUI;
import javax.swing.plaf.basic.BasicArrowButton;
class ComboBoxButtonTest extends JFrame
{
  public ComboBoxButtonTest()
  {
    setLocation(400,300);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    JPanel p = new JPanel();
    p.add(new BasicArrowButton(BasicArrowButton.SOUTH,
                UIManager.getColor("ComboBox.buttonBackground"),
                UIManager.getColor("ComboBox.buttonShadow"),
                UIManager.getColor("ComboBox.buttonDarkShadow"),
                UIManager.getColor("ComboBox.buttonHighlight")){
                  public Dimension getPreferredSize(){
                   return new Dimension(100, 100);}});
    getContentPane().add(p);
    pack();
  }
  public static void main(String[] args){new ComboBoxButtonTest().setVisible(true);}
}
```
Wie ich das jetzt aber einer (meiner) JComboBox beibringe, zu benutzen, ist mir noch ein Rätsel.


----------



## columbo (17. Mrz 2008)

Hat schon jemand eine Lösung für das Problem gefunden?

Ausserdem ist der ScrollBar in der Auswahlliste genauso schmal. Den hätte ich auch dann gerne genauso breit wie den Pull Down Button.


----------



## MiDniGG (17. Mrz 2008)

Hm. Also das Einzige was ich bis jetzt rausgefunden hab ist, dass man mit:


```
UIManager.put("ComboBox.background", Color.ORANGE);
```

Die Hintergrundfarbe vom Button (UND der Box selbst) ändern kann.

Und vermutlich mit


```
UIManager.put("ComboBox.foreground", Color.GREEN);
```

die Vordergrundfarbe (Also vom Text...)

Aber was man für die Größe eintragen soll??? Keine Ahnung... Also ich habs mit width/heigth probiert... Das ging nicht. Ich denk dass man da so in etwa ComboBox.buttonWidth schreiben muss. Aber kein Plan so gehts auf jeden Fall ned...

Aber wenns jemand hat bitte posten 

*Edit: Mein 100. Beitrag *freu**


----------



## MiDniGG (17. Mrz 2008)

Also ich hab nix neues gefunden...

Nur eben des alles:


```
UIManager.put("ComboBox.foreground", Color.RED);
UIManager.put("ComboBox.background", Color.BLUE);
UIManager.put("ComboBox.selectionBackground", Color.BLACK);
UIManager.put("ComboBox.selectionForeground", Color.WHITE);
```

Aber das ändert alles die komplette ComboBox... 

Irgendwo muss es doch die ganzen UIManager.put - Befehle geben, oder?! Falls da einer nen Link hat:
*Raus damit!!!  :x *
...................
büdde  :cry:


----------



## berny76 (21. Mrz 2008)

berny76 hat gesagt.:
			
		

> [...] Aber eins habe ich herausbekommen. Zum Zeichnen des Buttons einer JComboBox wird die Klasse BasicArrowButton eingesetzt. Eine Instanz dieser Klasse habe ich nach weiterer Recherche auch auf ein Panel setzen und vergrößern können. Hier mal der Code dazu:
> 
> 
> ```
> ...



Habe nun zumindest einen Ansatz gefunden, den Button zu modifizieren. Bedingt durch den Standard-LaF (Metal), den ich verwende, wird der BasicArrowButton so nicht verwendet. In dem Falle ist es ein spezieller JButton mit einem aufgesetzten Icon, das unter anderem bei der Breite einen festen Wert zugewiesen bekommt. Daher bleibt es - egal wie groß die combobox ist - immer gleich breit. Habe ich nun also versucht den Getter für die Breite zu überschreiben. Das führte zu dem gewünschten Ergebnis. Leider wird der Pfeil auf dem Button verzerrt dargestellt. Dagegen habe ich noch keine Lösung gefunden.

Hier die Hauptklasse für den Programmstart:


```
package spielwiese;

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

class ComboBoxButtonTest extends JFrame
{
  public ComboBoxButtonTest()
  {      
    setLocation(400,300);
    setDefaultCloseOperation(EXIT_ON_CLOSE);    
    JPanel p = new JPanel();    
    JComboBox combo = new JComboBox(new String[] {"Testeintrag1", "Testeintrag2", "Testeintrag3", "Testeintrag4"} );
    combo.setFont(new java.awt.Font("Tahoma", Font.BOLD, 40));
    
    combo.setUI(new MyMetalComboBoxUI());
    
    p.add(combo);
    getContentPane().add(p);
    pack();
  }
  public static void main(String[] args){new ComboBoxButtonTest().setVisible(true);}
}
```


Hier meine Version des MetalComboBoxUI:


```
package spielwiese;

import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.plaf.metal.MetalBorders;
import javax.swing.plaf.metal.MetalComboBoxButton;
import javax.swing.plaf.metal.MetalComboBoxIcon;
import javax.swing.plaf.metal.MetalComboBoxUI;
import javax.swing.plaf.metal.MetalLookAndFeel;

/**
 *
 * @author berny
 */
public class MyMetalComboBoxUI extends MetalComboBoxUI {
    
    /** Creates a new instance of MyMetalComboBoxUI */
    public MyMetalComboBoxUI() {
        super();
    }
    
    @Override
    protected JButton createArrowButton() {
        boolean iconOnly = (comboBox.isEditable() ||
                            //MetalLookAndFeel.usingOcean());       //leider habe ich kein Zugriff auf usingOcean()
                            true);
        JButton button = new MetalComboBoxButton( comboBox,
                                                  new MetalComboBoxIcon() {
                                                      @Override public int getIconWidth() { return 20; }},
                                                  iconOnly,
                                                  currentValuePane,
                                                  listBox );
        button.setMargin( new Insets( 0, 1, 1, 3 ) );

        //if (MetalLookAndFeel.usingOcean()) {       //leider habe ich kein Zugriff auf usingOcean()
        if (true) {
            // Disabled rollover effect.
            button.putClientProperty(0,
                                     Boolean.TRUE);
        }
        
        updateButtonForOcean(button);
        return button;
        
    }
    
    /**
     * Resets the necessary state on the ComboBoxButton for ocean.
     */
    private void updateButtonForOcean(JButton button) {
        if (true) {
            // Ocean renders the focus in a different way, this
            // would be redundant.
            button.setFocusPainted(comboBox.isEditable());
        }
    }
    
}
```

Es ist nur ein Ansatz. Letztendlich muss man das wahrscheinlich eh über einen anderes LaF machen.


----------

