ComboBox scrollen bei gleichen Item

package comboboxproblem;

import javax.swing.*;

/**
 *
 * @author Kiri
 */
public class ComboBoxProblem {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(100, 70);
        JComboBox comboBox = new JComboBox();
        String[] model = new String[300];
        for(int i = 0; i < model.length; i++){
            if(i == 244){
                model** = "Firma 144";
            }else{
                model** = "Firma " + i;
            }
        }
        comboBox.setModel(new DefaultComboBoxModel(model));
        frame.add(comboBox);
        frame.setVisible(true);
    }
}

Bin auf folgendes Problem gestoßen. Habe zur Übersicht oberes Beispiel angefertigt. Scrollt man mit der ARROW_DOWN-Taste dann scrollt man bis “Firma 243” dann springt er zurück auf “Firma 145” und scrollt dann wieder bis “Firma 243” uswusf.

Da in meinem wirklichen Programm kein Item doppelt sein sollte, habe ich das Problem jetzt nicht und will deshalb auch nicht die Zeit damit verbringen. Aber vielleicht kennt ja einer dieses Problem. Interessieren würde es mich ja schon, wie man da verfahren kann.

Viele Grüße
Kiri

Haha ist ja interessant. :slight_smile: Möglicherweise hast du das Problem nicht, wenn im Model Objekte sind und nur deren Labels gleich sind. Sprich „Firma 144“ ist nur das was der toString()-Methode raus kommt, aber die Objekte sind trotzdem verschieden. Habe es nicht probiert, könnte mir aber vorstellen, dass das helfen könnte. Ansonsten empfiehlt es sich wohl einfach nicht gleiche Objekte mehrmals in der Combobox zu haben bzw gleich Strings in dem Fall.

Edit: Das hat mich jetzt doch in den Fingern gejuckt!


/**
 * 
 * @author Kiri
 */
public class ComboBoxProblem {
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(100, 70);
		JComboBox comboBox = new JComboBox();
		Firma[] model = new Firma[300];
		for (int i = 0; i < model.length; i++) {
			if (i == 244) {
				model** = new Firma(144);
			} else {
				model** = new Firma(i);
			}
		}
		comboBox.setModel(new DefaultComboBoxModel(model));
		frame.add(comboBox);
		frame.setVisible(true);
	}

}

class Firma {

	private int n;

	public Firma(int number) {
		n = number;
	}

	@Override
	public String toString() {
		return "Firma " + n;
	}
}```

Mit diesem Code siehst du, dass er nicht zurück springt. :) Also war so wie ich vermutete.

Nicht ganz
es liegt daran, dass du jetzt keine überschriebene equals Methode nutzt

public class Test {

  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(100, 70);
    JComboBox comboBox = new JComboBox();
    Tester[] model = new Tester[300];
    for (int i = 0; i < model.length; i++) {
      if (i == 244) {
        model** = new Tester("Firma 144",i);
      } else {
        model** = new Tester("Firma " + i,i);
      }
    }
    comboBox.setModel(new DefaultComboBoxModel(model));
    frame.add(comboBox);
    frame.setVisible(true);
  }
  
  
  private static class Tester{
    private final String name;
    private final int i ;
    public Tester(String name, int i){
      this.name = name;
      this.i = i;
    }
    
    @Override
    public int hashCode(){
      return i;
    }
    
    public boolean equals(Object other){
       return (other instanceof Tester)  && ((Tester)other).name.equals(name);   // && ((Tester)other).i == i;
    }
    
    public String toString(){
      return name;
    }
  }
}

Wenn du das ganze so ausführst springt er auch wieder, wenn ich aber den auskommentierten Teil wieder dazugebe sprint es nicht

Das kommt doch aufs Gleiche raus. :slight_smile: Das meinte ich mit „Die Objekte sind verschieden“. Da bei einer eigenen Klasse ohne Implementierung der equals()-Methode eben die Objekt-Referenz gilt. Im Falle von String sind sie eben auch dann identisch, wenn beide Strings die gleiche „character sequence“ (wie es im englischen so schön heißt) repräsentieren.

okey hab dich wohl falsch verstanden :wink:

Danke an euch beiden, habt natürlich recht. Objekte zu verwenden ist natürlich eine Möglichkeit, aber ich dachte eher an eine Lösung um String[] verwenden zu können. Also eher an etwas wie eine Methode der ComboBox, die man vielleicht auf false setzt und es wird nicht verglichen. Aber ich gehe mal davon aus, dass es sowas nicht gibt.

By the way. Ist das normal, dass ich kein Icon für die Java-Tags habe und das die Einrückungen verschwinden, wenn ich mir vor dem erstellen eine Vorschau angesehen habe. Statt java war es plötzlich eine Liste.