# JComboBox gleicher Inhalt bedeutet gleicher Index?



## Verjigorm (16. Jan 2009)

Hallo,

ich bin grade irgendwie etwas verblüfft über die JComboBox.
Vielleicht steh ich auch nur auf dem Schlauch 
Wenn ich mir den selectedIndex() ausgeben lasse und die Inhalte der JCombobox sind GLEICH,
dann kriege ich immer den kleinsten Index zurückgelifert.
Wieso ist das so?

Bsp:
Combobox mit Inhalt "5","5", "5", "anders"
liefert als index immer nur 0 oder 3  :?: 
Wie kann ich das vermeiden?
Ich möchte Datumswerte selektieren
Wobei jedes Datum mehrfach auftreten kann.
Über den selectedIndex() wollte ich dann auf den Inhalt einer ArrayList zugreifen und den "zugehörigen" Wert dort rauslesen....

mfg Verjigorm

Zur Veranschaulichung:



```
package comboBoxtest;

import javax.swing.SwingUtilities;
import java.awt.BorderLayout;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JComboBox;

public class SameValueTest extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JComboBox jComboBox = null;

	/**
	 * This method initializes jComboBox	
	 * 	
	 * @return javax.swing.JComboBox	
	 */
	private JComboBox getJComboBox() {
		if (jComboBox == null) {
			jComboBox = new JComboBox();
			
			DefaultComboBoxModel model = new DefaultComboBoxModel();
			model.addElement("5");
			model.addElement("5");
			model.addElement("5");
			jComboBox.setModel(model);
			
//			jComboBox.addItem("5");
//			jComboBox.addItem("5");
//			jComboBox.addItem("5");
			
			jComboBox.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed(): " + jComboBox.getSelectedIndex()); 
				}
			});
		}
		return jComboBox;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				SameValueTest thisClass = new SameValueTest();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

	/**
	 * This is the default constructor
	 */
	public SameValueTest() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJComboBox(), BorderLayout.SOUTH);
		}
		return jContentPane;
	}

}
```


----------



## Marco13 (16. Jan 2009)

Die ComboBox liefert den ersten Index, an dem ein Element steht, das "equals" zu dem ist, was bei getSelectedItem zurückgegeben wird. Abhilfen... gäb's da mehrere ... die Date-Objekte in eine eigene Klasse "einwickeln", oder getSelectedIndex passend überschreiben ... alles nicht so toll  :? vielleicht hat jemand anderes da eine gute Idee..


----------



## Michael... (16. Jan 2009)

Was macht das für einen Sinn in einer ComboBox mehrere für den Anwender nicht zu unterscheidende Inhalte aufzulisten bzw. wieso sollte er den zweiten Eintrag wählen, wenn der erste doch genauso ausschaut?


----------



## Zed (16. Jan 2009)

Die Combobox arbeitet mit Objekten. 

Wenn du 5 mal das selbe Object hinzufügst wird er auch wenn du nach dem Object suchst das erste das dem Object entspricht ausgeben.

Du hast jetzt 3 mal die 5 hinzugefügt. Du suchst nach 5 also wird von jedem Object die equals Methode aufgerufen. Beim equals auf einen String wird nunmal der inhalt des Strings verglichen und nicht das Object.


----------



## Ebenius (16. Jan 2009)

Zed hat gesagt.:
			
		

> Wenn du 5 mal das selbe Object hinzufügst


... oder auch das gleiche ...


----------



## Verjigorm (16. Jan 2009)

Michael... hat gesagt.:
			
		

> Was macht das für einen Sinn in einer ComboBox mehrere für den Anwender nicht zu unterscheidende Inhalte aufzulisten bzw. wieso sollte er den zweiten Eintrag wählen, wenn der erste doch genauso ausschaut?



Weil es nen einfachen zeitlichen Ablauf darstellen soll und nur das Tagesdatum interessant ist.
Höchster Eintrag = frühster Eintrag an diesem Tag.
Weil man auch im Nachhinein für zurückliegende Tage eintragen kann, ist die Uhrzeit belanglos.
Naja dann werd ich es vielleicht doch in einer Tabellenstruktur abbilden.


----------



## Ebenius (16. Jan 2009)

In dem Fall sollten doch wahrscheinlich Stunden, Minuten, Sekunden vorhanden sein und nur vom Renderer nicht mit angezeigt werden.

Alternativ kannst Du Dir natürlich auch Wrapper-Objekte in die Combo Box legen, zum Beispiel sowas: 
	
	
	
	





```
class ObjectWrapper {
  final Object delegate;

  ObjectWrapper(Object delegate) {
    this.delegate = delegate;
  }

  Object getDelegate() {
    return delegate;
  }

  @Override
  public void toString() {
    return delegate.toString();
  }
}
```

Das ist höchstens mittelmäßig schön, aber wenn das Dein Problem löst ... so what?

Aber wegen dieses Problems würde ich nicht die Komponente wechseln.

Ebenius


----------



## Marco13 (16. Jan 2009)

Wenn du von "Eintrag" redest, kannst du ja vielleicht DOCH (sinnvoll, in diesem Fall) eine Klasse machen

```
class Entry
{
    Date date = ...
    String otherStuffLikeTimeOrSomething ....

    public String toString()
    {
        return date.toString();
    }

    public boolean equals(Object object)
    {
         return nur true, wenn sie wirklich gleich sind (und false, wenn NUR das Datum gleich ist)
         (hashCode auch passend überschreiben!!!)
    }
}
```


----------

