# JComboBox andere Darstellung des Inhaltes + größe der Auswah



## outbreaker (28. Jan 2008)

Hallo

ich habe folgendes Problem:
1) ich habe eine JComboBox und möchte das wenn der Benutzer die JComboBox öffnet die Größe der Liste nicht in der Breite auf die Breite der JComboBox begrenzt ist (Bild 1).

2) Möchte ich das die Auswahlliste ungefähr so aussieht:

1 -- Beschreibung
2 -- Beschreibung
3 -- Beschreibung
...

Wenn aber ein Punkt ausgewählt wurde das nur die Zahl angezeigt wird (Also ohne die Punkte usw wie in Bild 2)
Habe dazu mal einen ListCellRenderer geschrieben der das auch macht aber wie bekomme ich in dem Renderer raus ob die ComboBox geöffnet ist oder nicht? Weil mit dem Renderer werden mir immer nur die Zahlen angezeigt! (Bild 3)







Danke für die Hilfe


----------



## outbreaker (28. Jan 2008)

Das Problem mit dem Anzeigen habe ich gelöst aber breiter habe ich es noch nicht bekommen!
Hat da jemand eine Idee oder einen Ansatz?


Den Code werde ich dann später posten für den Renderer

Wäre für jeden Tipp dankbar


----------



## SlaterB (28. Jan 2008)

kommt doch auf Layout + setPreferedSize() und ähnliches an?


----------



## outbreaker (28. Jan 2008)

naja ich möchte ja das die ComboBox selber so klein bleibt wie in Bild 1 gezeigt aber ich möchte das die Liste welche aufgeht breiter ist.
Das ist mein Problem oder geht das nicht?


----------



## SlaterB (28. Jan 2008)

oha, das ist ja ein größeres Thema, viel Glück


----------



## outbreaker (28. Jan 2008)

na danke  :wink: 

vielleicht kommt ja noch einer mit einer Idee vorbei  :roll:


----------



## outbreaker (28. Jan 2008)

So ich konnte mir dank langem suchen in den weiten des www und meinem Freund google selber helfen  :wink: 

Hier jetzt mal der Lösungscode

Einmal der Renderer um die Darstellung zu ändern:


```
public class MyCellRenderer extends JLabel implements ListCellRenderer {
	
	private ListCellRenderer lcr;
	
     public MyCellRenderer(ListCellRenderer lcr) {
    	 this.lcr = lcr;
         setOpaque(true);
     }
     
     public Component getListCellRendererComponent(JList list,
                                                   Object value,
                                                   int index,
                                                   boolean isSelected,
                                                   boolean cellHasFocus) {

         setText(value.toString().substring(0, 1));

         if (list.isShowing())
         {
        	 return lcr.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
         }
         else
         {
        	 return lcr.getListCellRendererComponent(list, value.toString().substring(0, 1), index, isSelected, cellHasFocus);
         }
     }
     
 }
```

um die Größe der Liste zu ändern müssen zwei weitere Klassen angelegt werden 
einmal die SteppedComboBoxUI


```
public class SteppedComboBoxUI extends MetalComboBoxUI {
	 
	protected ComboPopup createPopup() 
	{
		    BasicComboPopup popup = new BasicComboPopup( comboBox ) {
		        
		      public void show() {
		        Dimension popupSize = ((SteppedComboBox)comboBox).getPopupSize();
		        popupSize.setSize( popupSize.width,
		          getPopupHeightForRowCount( comboBox.getMaximumRowCount() ) );
		        Rectangle popupBounds = computePopupBounds( 0,
		          comboBox.getBounds().height, popupSize.width, popupSize.height);
		        scroller.setMaximumSize( popupBounds.getSize() );
		        scroller.setPreferredSize( popupBounds.getSize() );
		        scroller.setMinimumSize( popupBounds.getSize() );
		        list.invalidate();            
		        int selectedIndex = comboBox.getSelectedIndex();
		        if ( selectedIndex == -1 ) {
		          list.clearSelection();
		        } else {
		          list.setSelectedIndex( selectedIndex );
		        }            
		        list.ensureIndexIsVisible( list.getSelectedIndex() );
		        setLightWeightPopupEnabled( comboBox.isLightWeightPopupEnabled() );

		        show( comboBox, popupBounds.x, popupBounds.y );
		      }
		    };
		    popup.getAccessibleContext().setAccessibleParent(comboBox);
		    return popup;
	}
}
```

und dann noch die SteppedComboBox welche von JComboBox abgeleitet ist


```
public class SteppedComboBox extends JComboBox {
	  protected int popupWidth;
	  
	  public SteppedComboBox(ComboBoxModel aModel) {
	    super(aModel);
	    //setUI(new SteppedComboBoxUI());
	    popupWidth = 0;
	  }

	  public SteppedComboBox(final Object[] items) {
	    super(items);
	    //setUI(new SteppedComboBoxUI());
	    popupWidth = 0;
	  }
	  
	  public SteppedComboBox(Vector items) {
	    super(items);
	    //setUI(new SteppedComboBoxUI());
	    popupWidth = 0;
	  }
	  
	  
	  public void setPopupWidth(int width) {
	    popupWidth = width;
	  }
	  
	  public Dimension getPopupSize() {
	    Dimension size = getSize();
	    if (popupWidth < 1) popupWidth = size.width;
	    return new Dimension(popupWidth, size.height);
	  }
	}
```


So nun noch eine Klasse zum Ausführen und fertig ist es:


```
public class MyJCB extends JFrame{

	private SteppedComboBox jCB;
	private String[] inhalt = {"1 -- das ist der Text","2 -- das ist der zweite","3 -- das ist der dritte"};
	
	public MyJCB() 
	{
		jCB = new SteppedComboBox(inhalt);
		jCB.setBounds(10, 10, 50, 21);
		jCB.setRenderer(new MyCellRenderer(jCB.getRenderer()));
		jCB.setPopupWidth(300);
		this.setSize(200, 200);
		this.setLayout(null);
		this.add(jCB);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
	
	public static void main(String[] args) {
		new MyJCB();
	}
}
```

Hilfe für diesen Code habe ich hier gefunden: www.codeguru.com/java/articles/163.shtml

Danke an alle die Versucht haben mir zu helfen


----------



## Ariol (28. Jan 2008)

Ich hab beim Googlen was gefunden:
http://forums.java.net/jive/message.jspa?messageID=61262


Hab das dann mal eingebaut und etwas angepasst:

```
import java.awt.Dimension;

import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JPopupMenu;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;

public class OwnJComboBox extends JComboBox implements PopupMenuListener
{
	private Dimension popupSize = getPreferredSize();
	
	public OwnJComboBox(Object[] items)
	{
		super(items);
		addPopupMenuListener(this);
	}

	public Dimension getPopupSize()
	{
		return popupSize;
	}
	
	public void setPopupSize(Dimension popupSize)
	{
		this.popupSize = popupSize;
	}
	
	public void popupMenuCanceled(PopupMenuEvent e)
	{}

	public void popupMenuWillBecomeInvisible(PopupMenuEvent e)
	{}

	public void popupMenuWillBecomeVisible(PopupMenuEvent e)
	{
		JComboBox box = (JComboBox) e.getSource();
		Object comp = box.getUI().getAccessibleChild(box, 0);
		if (comp instanceof JPopupMenu)
		{
			JPopupMenu popup = (JPopupMenu) comp;
			JComponent scrollPane = (JComponent) popup.getComponent(0);
			Dimension size = scrollPane.getPreferredSize();
			
			size = getPopupSize();
			scrollPane.setSize(size);
			scrollPane.setPreferredSize(size);
			scrollPane.getLayout().preferredLayoutSize(scrollPane);
			System.out.println(scrollPane.getComponentCount());
		}
	}

}
```

Alles nicht gerade sauber und der Text wird zumindest bei mir nicht richtig angezeigt, aber zumindest mal ein Anfang ^^


EDIT: @outbreaker:Schön, dass du was gefunden hast. Bei deiner Lösung kann es aber passieren, dass die Combobox nicht mehr ins L&F passt, wenn du das einmal ändern willst.
Soll deiner Lösung jetzt aber keinen Abbruch tun.  :wink:


----------



## outbreaker (28. Jan 2008)

ok danke für den Hinweis werde mir mal deine Idee auch noch ansehen


----------



## Guest (28. Jan 2008)

Hi,

finde ich gut, dass Du andere an deiner Lösung teilhaben läßt und dich nicht einfach nicht mehr meldest. :toll: 

Gruß monet


----------



## outbreaker (28. Jan 2008)

ist für mich selbstverständlich :wink: 
habe selber schon oft in Foren gelesen und gedacht schön und wo ist nun die Lösung zu dem Problem :?: 
Nur ein "hat sich Erleding habe Problem gelöst" hilft ja anderen nicht weiter
 :wink:


----------



## Guest (28. Jan 2008)

> Nur ein "hat sich Erleding habe Problem gelöst" hilft ja anderen nicht weiter



Sehe ich genauso. Man verlangt ja hier nicht von jemanden, dass er einen kompletten Code heraus-
gibt. Ich betrachte so etwas immer als einen Denkanstoß für eigene Programme. Manchmal kann
auch nur ein kleiner Codeschnipsel schon eine Lösung für sein eigenes Prog. sein oder man 
erkennt einen neuen Ansatz, der einem noch nicht eingefallen ist. :###

Weiter so,

Gruß monet


----------

