I have the following problem. My task is to create a double bond between my sudoku field object and its graphical form in the GUI. So far I've managed to come up with something like this.
TextField textField = new TextField();
JavaBeanIntegerPropertyBuilder builder = JavaBeanIntegerPropertyBuilder.create();
JavaBeanIntegerProperty test = builder.bean(board.getSudokuField(i,j))
.name("FieldValue").build();
StringConverter<Number> converter = new NumberStringConverter();
Bindings.bindBidirectional(textField.textProperty(), test, converter);
The solution works, but if you enter any character other than a number, it throws a parse error.
Caused by: java.text.ParseException: Unparseable number: "a"
Is this the best way to somehow change the type of bond? Or adding a condition regarding the input values,but I just don't know how to do it. board.getSudokuField(i,j) return SudokuField Object. And there are int getFieldValue() which return int and void setFieldValue(int value)
CodePudding user response:
So here's my solution, the numbers entered into the TextField can only be a number between 1 and 9.
TextField textField = new TextField();
JavaBeanIntegerPropertyBuilder builder =
JavaBeanIntegerPropertyBuilder.create();
JavaBeanIntegerProperty test = builder.bean(board.getSudokuField(i,j))
.name("FieldValue").build();
StringConverter<Number> converter = new NumberStringConverter();
textField.setTextFormatter(new TextFormatter<>(c -> {
if (c.isContentChange()) {
if (c.getControlNewText().length() == 0) {
return c;
}
try {
Integer.parseInt(c.getControlNewText());
if (Integer.parseInt(c.getControlNewText()) > 9
|| Integer.parseInt(c.getControlNewText()) == 0) {
return null;
}
return c;
} catch (NumberFormatException ignored) {
ignored.getMessage();
}
return null;
}
return c;
}));
Bindings.bindBidirectional(textField.textProperty(), test, converter);
