I tested Spinner control in Java 8u40
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class MainApp extends Application
{
public static void main(String[] args)
{
Application.launch(args);
}
@Override
public void start(Stage stage)
{
final Spinner spinner = new Spinner();
spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 10000));
spinner.setEditable(true);
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(10));
int row = 0;
grid.add(new Label("Spinner:"), 0, row);
grid.add(spinner, 1, row);
Scene scene = new Scene(grid, 350, 300);
stage.setTitle("Hello Spinner");
stage.setScene(scene);
stage.show();
}
}
How I can only insert number into the spinner control field?
Now I can insert numbers and text. Is there any example that can be used as example?
Not entirely certain about the requirement - assuming that you want to prevent the input of characters that wouldn't parse to a valid Number.
If so, usage of a TextFormatter in the Spinner's editor comes to the rescue: with it, you'll monitor any change of text and either accept or reject it. The decision is encapsulated inside the formatter's filter. A very simple version (there's definitely more to do, see Swing's DefaultFormatter)
// get a localized format for parsing
NumberFormat format = NumberFormat.getIntegerInstance();
UnaryOperator<TextFormatter.Change> filter = c -> {
if (c.isContentChange()) {
ParsePosition parsePosition = new ParsePosition(0);
// NumberFormat evaluates the beginning of the text
format.parse(c.getControlNewText(), parsePosition);
if (parsePosition.getIndex() == 0 ||
parsePosition.getIndex() < c.getControlNewText().length()) {
// reject parsing the complete text failed
return null;
}
}
return c;
};
TextFormatter<Integer> priceFormatter = new TextFormatter<Integer>(
new IntegerStringConverter(), 0, filter);
spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(
0, 10000, Integer.parseInt(INITAL_VALUE)));
spinner.setEditable(true);
spinner.getEditor().setTextFormatter(priceFormatter);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With