# jComboBox itemlänge



## Imunar (17. Nov 2009)

Guten Morgen, ich habe mal wieder eine kleine Frage.
ist es möglich mit einer jComboBox die Einträge während des Dropdown komplett anzeigen zu Lassen aber nach der auswahl die Combox weiterhin in der Festgelegten größe behlten?

Also vergleichsweise bei HTML Dropdownboxen (im NICHT IE)
die die auswahlliste selber auf die maximale breite einstellt.

(finde heute natürlich kein beispiel dafür =_= )
[edit: hier ist zwar mit ein wenig hantiert worden aber die thematik stellt es gut da:
geht das dort auch mit java?
Drop down <select /> with fixed width
]

gibt es da auch eine Lösung unter Java?
Denn die Combobox soll eine feste Breite haben dennoch aber die Einträge beim auswählen komplett enzeigen.

Mfg
Imunar


----------



## eRaaaa (17. Nov 2009)

/edit: ohje, zu früh am morgen, 

vllt hilft auch das:
How to Use Combo Boxes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## KrokoDiehl (17. Nov 2009)

Moin.
Ich hatte so ein Problem auch mal und bin auf keine einfache Lösung gestoßen (was nicht heißen soll, dass es keine gibt).
Die _JComboBox _benutzt intern eine Implementierung von _ComboPopup_. Das ganze läuft aber über die _ComboBoxUI _Klasse. Also mein Fazit: Das _ComboPopup _ist tief drin und es gibt keinen Setter oder dergleichen um es einfach auszutauschen. Ich denke man muss eine eigene _ComboBoxUI_-Klasse schreiben, zumindest sehe ich keinen direkteren Weg. In der Implementierung von _BasicComboPopup _(ein _ComboPopup_) habe ich den Code gesehen, der die Größe des Popups berechnet, und darin die Größe der _JComboBox _benutzt, aber keine weitere Einflussnahme entdeckt.

Vielleicht kann man aber von außen her etwas machen, indem man z.B. einen _PopupMenuListener _an die Combobox hängt und darauf reagiert. Ich habe das aber nie probiert.


----------



## Imunar (17. Nov 2009)

KrokoDiehl hat gesagt.:


> Moin.
> Ich hatte so ein Problem auch mal und bin auf keine einfache Lösung gestoßen (was nicht heißen soll, dass es keine gibt).
> Die _JComboBox _benutzt intern eine Implementierung von _ComboPopup_. Das ganze läuft aber über die _ComboBoxUI _Klasse. Also mein Fazit: Das _ComboPopup _ist tief drin und es gibt keinen Setter oder dergleichen um es einfach auszutauschen. Ich denke man muss eine eigene _ComboBoxUI_-Klasse schreiben, zumindest sehe ich keinen direkteren Weg. In der Implementierung von _BasicComboPopup _(ein _ComboPopup_) habe ich den Code gesehen, der die Größe des Popups berechnet, und darin die Größe der _JComboBox _benutzt, aber keine weitere Einflussnahme entdeckt.
> 
> Vielleicht kann man aber von außen her etwas machen, indem man z.B. einen _PopupMenuListener _an die Combobox hängt und darauf reagiert. Ich habe das aber nie probiert.



danke,
uff das hört sich nicht nach einer schnellen lösung an. aber werde ich mir bei zeiten ansehen...
dachte das es bei java evlt ne build in lösung gibt... 
mal schaun ob es es hinbekomme.

Bin aber auch für weitere vorschläge sehr Dankbar

Imu


----------



## KrokoDiehl (17. Nov 2009)

Imunar hat gesagt.:
			
		

> Bin aber auch für weitere vorschläge sehr Dankbar


...da schließe ich mich an 
Aktuell ist das Problem über eine eigene Komponente gelöst, die wie eine ComboBox reagiert. Aber es gab noch weitere Gründe für diese eigene Implementierung, daher bringt die dir sicher nichts.


----------



## Michael... (17. Nov 2009)

Hatte in der Mittagspause zu viel Zeit und hab mal ein bisschen rumprobiert. Bin noch nicht ganz an das gewünschte Ergebnis ran gekommen.
- man müsste noch ein paar Anpassungen machen, damit das ganze auch mit LayoutManagern geht. 
- wenn man ins Textfeld clickt funktioniert das ganze soweit, wenn man aber den Dropdown über den Button öffnet, muss man den Eintrag mit gedrückter Maustaste auswählen

Vielleicht hilft Euch der Ansatz ja weiter, vielleicht ist er aber auch eine Sackgasse

```
import java.awt.Component;

import javax.swing.*;
import javax.swing.event.*;

public class ComboRendererDemo extends JFrame {
	private JComboBox combo;
	private MyComboRenderer renderer;

	public ComboRendererDemo() {
		this.getContentPane().setLayout(null);
		combo = new JComboBox(new String[] { "Option 1", "Option 2",
				"gaaaanz laaaaange Option 3" });
		combo.setBounds(100, 100, 80, 26);
		this.getContentPane().add(combo);
		combo.setRenderer(renderer = new MyComboRenderer());

		combo.addPopupMenuListener(new PopupMenuListener() {

			public void popupMenuCanceled(PopupMenuEvent evt) {}

			public void popupMenuWillBecomeInvisible(PopupMenuEvent evt) {
				setMinComboSize();
			}

			public void popupMenuWillBecomeVisible(PopupMenuEvent evt) {
				if (!popupIsResizing) {
					popupIsResizing = true;
					setPrefComboSize();
					combo.showPopup();
					popupIsResizing = false;
				}
			}
		});
	}
	
	private boolean popupIsResizing = false;

	private void setMinComboSize() {
		combo.setSize(80, 26);
		combo.validate();
	}

	private void setPrefComboSize() {
		combo.setSize(renderer.getList().getPreferredSize().width + 30, combo
				.getPreferredSize().height);
		combo.validate();
	}

	public static void main(String[] args) {
		JFrame frame = new ComboRendererDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

	class MyComboRenderer extends DefaultListCellRenderer {
		private JList list;

		public Component getListCellRendererComponent(JList list, Object value,
				int index, boolean isSelected, boolean cellHasFocus) {
			this.list = list;
			return super.getListCellRendererComponent(list, value,
					index, isSelected, cellHasFocus);
		}

		public JList getList() {
			return list;
		}
	}
}
```


----------



## noobadix (17. Feb 2011)

Hi,

ich habe soeben das hier gefunden: Stepped ComboBox Example : ComboBoxSwing ComponentsJava
Noch nicht getestet, aber schaut gut aus.

Gruß n.


----------



## Imunar (17. Feb 2011)

Moin,

ich glaube der Thread ist ein wenig überholt
(letzter Beitrag 1009)

Ich hatte es damals auf eine ähnlich Art und weise gelöst.

Gruß
Imu


----------

