Zahl aus Zahlenbereich auswählen

Status
Nicht offen für weitere Antworten.

redbomber

Bekanntes Mitglied
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.
 
also bei dem JSpinner kann ich ja den Wertebereich angeben.
Aber was passiert wenn der Benutzer einen größeren Wert angibt?
 
Ich glaube standardmäßig läßt der das nicht zu, d.h. nimmt die Eingabe dann nicht an... kann mich aber auch täuschen...
 
Gibt es eine Möglichkeite eine zu hohe Eingabe abzufangen?
Habe es wie folgt probiert:

Code:
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.
 
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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben