# Zahl aus Zahlenbereich auswählen



## redbomber (26. Mrz 2009)

Hi zusammen,

welche Komponente kann ich verwenden, wenn ich dem Benutzer eine Zahl auswählen lassen möchte, von einem Bereich zwischen z.b. 1 bis 20.

Er sollte die Zahl auch selber eintippen können.

Allerdings wenn er eine zu große Zahl eintippt sollte das nicht gehen.


----------



## Verjigorm (26. Mrz 2009)

Editierbare JCombobox würde ich nehmen


----------



## Hadernlump (26. Mrz 2009)

Wie wäre es mit einem JSpinner?


----------



## SlaterB (26. Mrz 2009)

siehe auch
http://www.java-forum.org/java-faq-beitraege/7213-jtextfield-dokumentarten.html


----------



## Verjigorm (26. Mrz 2009)

SlaterB hat gesagt.:


> siehe auch
> http://www.java-forum.org/java-faq-beitraege/7213-jtextfield-dokumentarten.html



fehlt halt die vorgegebene Auswahlmöglichkeit von 1-20


----------



## redbomber (26. Mrz 2009)

also bei dem JSpinner kann ich ja den Wertebereich angeben.
Aber was passiert wenn der Benutzer einen größeren Wert angibt?


----------



## Verjigorm (26. Mrz 2009)

Das musst du natürlich dann abfragen


----------



## Marco13 (26. Mrz 2009)

Ich glaube standardmäßig läßt der das nicht zu, d.h. nimmt die Eingabe dann nicht an... kann mich aber auch täuschen...


----------



## redbomber (26. Mrz 2009)

Gibt es eine Möglichkeite eine zu hohe Eingabe abzufangen?
Habe es wie folgt probiert:


```
protected SpinnerNumberModel numberModel;
protected JSpinner spinner;

numberModel = new SpinnerNumberModel( 1, firstPos, lastPos, 1);
spinner = new JSpinner( numberModel );
numberModel.addChangeListener(new ChangeListener(){

@Override
public void stateChanged(ChangeEvent e) {
Double val =  (Double)(numberModel.getValue());
Double max = (Double) numberModel.getMaximum();
    if(val > max){
	System.out.println("Val is too high");
        numberModel.setValue(max);
     }
   }
});
```

Aber wenn ein zu hoher Wert eingegeben wird, dann ist dieser zwar im Feld angezeigt,
aber ich kann dann weder runter noch hoch klicken.
Gerne würde ich den Wert stattdessen auf die maximal Range setzen.


----------



## Ebenius (26. Mrz 2009)

Die gute JSpinner-Klasse. Diese Klasse kann so wenig verglichen mit dem Komfort und die Flexibilität die man von Swing sonst gewohnt ist. Das Ding ist so sehr verbaut, eine vernünftige, generische Lösung die null-Values unterstützt hat mich drei Tage gekostet.

Zum Glück liegt das Problem hier nicht ganz so tief; diese Lösung kann nur Integer: [Highlight=Java]spinner.setEditor(new JSpinner.NumberEditor(spinner) {

  @Override
  public void commitEdit() throws ParseException {
    try {
      super.commitEdit();
    } catch (ParseException ex) {
      final JSpinner spinner = getSpinner();
      if (spinner != null) {
        final JFormattedTextField tf = getTextField();
        final Number num = getFormat().parse(tf.getText());
        final Object rollbackValue = fixValue(num);

        // put value in range after all pending events are processed
        SwingUtilities.invokeLater(new Runnable() {

          public void run() {
            tf.setValue(rollbackValue);
          }
        });
      }
    }
  }

  private Integer fixValue(Number val) {
    final Integer value;
    if (val instanceof Integer) {
      value = (Integer) val;
    } else {
      value = new Integer(val.intValue());
    }

    final SpinnerModel model = getSpinner().getModel();
    if (model instanceof SpinnerNumberModel) {
      final SpinnerNumberModel numModel = (SpinnerNumberModel) model;
      final Integer max = (Integer) numModel.getMaximum();
      final Integer min = (Integer) numModel.getMinimum();
      if (value.compareTo(min) < 0) {
        return min;
      } else if (value.compareTo(max) > 0) {
        return max;
      }
    }

    return value;
  }
});[/Highlight]
Ebenius


----------

