У меня есть класс объектов Trade
с
public class Trade {
private DoubleProperty price;
private ReadOnlyBooleanWrapper caution;
public Trade(double price){
this.price = new SimpleDoubleProperty(price);
this.caution = new ReadOnlyBooleanWrapper();
this.caution.bind(this.volume.greaterThan(0));
}
public double getPrice(){
return this.price.get();
}
public DoubleProperty priceProperty(){
return this.price;
}
public void setPrice(double price){
this.price.set(price);
}
}
В моем классе Controller у меня есть следующие TableView
и TableColumn
Проблема двояка:
- В столбце цены и цены принимается
double
. Но код EditingDoubleCell ниже возвращает только String. Как я могу заставить его возвращать double и всеString
введенный вами пользователь будет проигнорирован? - Вторая функция, которую я хотел бы иметь, заключается в следующем: шрифт внутри ячейки столбца
Price
(, говорящий о той же самой ценовой ячейке) изменит свой цвет на синий, когдаcaution
свойство true и красное, если свойствоcaution
является ложным?
public class EditingDoubleCell extends TableCell<Trade,String>{
private TextField textField;
public EditingDoubleCell() {
}
@Override
public void startEdit() {
if (!isEmpty()) {
super.startEdit();
createTextField();
setText(null);
setGraphic(textField);
textField.requestFocus();
//textField.selectAll();
}
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText((String) getItem());
setGraphic(null);
}
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
if (textField != null) {
textField.setText(getString());
}
setText(null);
setGraphic(textField);
} else {
setText(getString());
setGraphic(null);
}
}
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
private void createTextField(){
Locale locale = new Locale("en", "UK");
String pattern = "###,###.###";
DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(locale);
df.applyPattern(pattern);
//String format = df.format(123456789.123);
//System.out.println(format);
//NumberFormat nf = NumberFormat.getIntegerInstance();
textField = new TextField();
// add filter to allow for typing only integer
textField.setTextFormatter( new TextFormatter<>( c ->
{
if (c.getControlNewText().isEmpty()) {
return c;
}
ParsePosition parsePosition = new ParsePosition( 0 );
Object object = df.parse( c.getControlNewText(), parsePosition );
if ( object == null || parsePosition.getIndex() < c.getControlNewText().length() )
{
return null;
}
else
{
return c;
}
} ) );
textField.setText( getString() );
textField.setMinWidth( this.getWidth() - this.getGraphicTextGap() * 2 );
// commit on Enter
textField.setOnAction( new EventHandler<ActionEvent>()
{
@Override
public void handle( ActionEvent event )
{
commitEdit( textField.getText() );
}
} );
textField.focusedProperty().addListener( new ChangeListener<Boolean>()
{
@Override
public void changed( ObservableValue<? extends Boolean> arg0,
Boolean arg1, Boolean arg2 )
{
if ( !arg2 )
{
commitEdit( textField.getText() );
}
}
} );
}
}