Eigene ComboBox / PopupMenu

  • Themenstarter Themenstarter ByeBye 31659
  • Beginndatum Beginndatum
B

ByeBye 31659

Hallo,

ich habe eine eigene ComboBox Klasse geschrieben, in der ich eine ID und einen Text Eintragen kann.

Wenn das PopupMenu ausgeklappt ist wird mir leider nicht der Eintrag markiert, über dem sich die Maus gerade befindet.

Welche Methode muss ich da eventuell überschreiben? Wenn ich versuche den MouseListener auf die ComboBox zu jagen, so wirkt dieser sich leider nicht auf das dazgehörige PopupMenu aus.

Hat da jemand Rat?
 
Code:
public class MyComboBox extends JComboBox {

	class MyComboRenderer extends JPanel implements ListCellRenderer
	{		
		public Component getListCellRendererComponent(JList arg0, Object arg1, int arg2, boolean arg3, boolean arg4) {
			MyListItem lstItem = (MyListItem)arg1;	
			return lstItem;		 
		}				
	}		

	class MyListItem extends JPanel
	{
		private int ID 	= 0 ;
		private String Teilnehmer	= null ;
		private String Firma = null;
		
		private JLabel lblTeilnehmer = null ;
		private JLabel lblFirma = null;
		
		public MyListItem(int ID, String Teilnehmer, String Firma)
		{
			this.ID = ID;
			this.Teilnehmer = Teilnehmer ;
			this.Firma = Firma;
			
			this.setLayout(new GridLayout());
			
		
			lblTeilnehmer = new JLabel(Teilnehmer) ;	
			lblFirma = new JLabel(Firma);

			this.add(lblTeilnehmer, BorderLayout.WEST);
			this.add(lblFirma, BorderLayout.CENTER);
			lblTeilnehmer.setOpaque(true);
			lblFirma.setOpaque(true);			
		}		
		
		public int getID()
		{
			return ID;
		}
		
		public String getTeilnehmer(){
			return Teilnehmer;
		}

		public String getFirma(){
			return Firma;
		}
		
	}	
	
	private DefaultComboBoxModel cboModel = new DefaultComboBoxModel();		
	public MyComboBox(){
		super();
		this.setModel(cboModel);
	}
		
	public int getID()
	{
		try{
			return ((MyListItem)this.getSelectedItem()).getID();
		}
		catch(Exception e){
			return 0;
		}
	}
	
	public String getTeilnehmer(){
		return ((MyListItem)this.getSelectedItem()).getTeilnehmer();
	}
	
	public String getFirma(){
		return ((MyListItem)this.getSelectedItem()).getFirma();
	}
	
	public void addItem(int ID, String Teilnehmer, String Firma) {
		cboModel.addElement(new MyListItem(ID, Teilnehmer, Firma));
		setRenderer(new MyComboRenderer());
	}
	
	public void removeSelectedItem(){
		cboModel.removeElementAt(getSelectedIndex());
	}
	
	public void removeAllItems(){
		cboModel.removeAllElements();
		setRenderer(new MyComboRenderer());
	}
	
	public int getIndexOfID(int ID){
		for(int i = 0; i < cboModel.getSize(); i++){
			setSelectedIndex(i);
			if(getID() == ID){
				return i;
			}
		}
		return -1;
	}
	
	public int getIndexOfText(String Teilnehmer){
		for(int i = 0; i < cboModel.getSize(); i++){
			setSelectedIndex(i);
			if(getTeilnehmer().equals(Teilnehmer)){
				return i;
			}
		}
		return -1;
	}
}
 
Hallo ExtremeSnail,

habe zwei Stellen an deinem Code geändert.
1. Opaque heisst undurchsichtig und nicht durchsichtig -> deswegen auf false setzen
2. Zeile 7 bis 13 hinzugefügt

Hättest du die Variablen der Methode getListCellRendererComponent richtig benannt, hättest du es vielleicht eher gesehen. Zeilen 7 bis 13 habe ich von hier geklaut:
http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer

Java:
	class MyComboRenderer extends JPanel implements ListCellRenderer {
		public Component getListCellRendererComponent(JList list, Object value,
				int index, boolean isSelected, boolean cellHasFocus) {

			MyListItem lstItem = (MyListItem) value;

			if (isSelected) {
				lstItem.setBackground(list.getSelectionBackground());
				lstItem.setForeground(list.getSelectionForeground());
			} else {
				lstItem.setBackground(list.getBackground());
				lstItem.setForeground(list.getForeground());
			}

			return lstItem;
		}
	}


Code:
lblTeilnehmer.setOpaque(false);
lblFirma.setOpaque(false);


Vg Erdal
 
Ah danke, es funktioniert genauso wie ich es haben wollte :-)

Tja nächstesmal doch die Zeit investieren und die Variablen richtig bennen ;-)
 
Zurück