将货币符号添加到Tableview中,但在编辑单元格上删除

尼基

我已经知道如何使用表单元格工厂回调来操纵表单元格。我在该单元格中添加了一个货币符号,使其看起来更整洁。(即5,00欧元,而不是5,00欧元)问题是,当我双击该单元格时,我希望删除该符号。但是对于它的麻烦,我无法找到如何再次操作文本字段以删除该货币符号并在用户提交编辑后将其重新带回的方法。基本上,在Excel中编辑单元格时,我尝试执行的操作与此类似:)。

有人可以通过一些基本示例帮助我吗?我需要使用OnEditStart事件吗?

詹姆斯_D

每当您想配置单元格中项目的显示方式而又不更改实际数据时,都应该使用custom TableCell这是一个展示您想要的行为的示例:

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.function.UnaryOperator;

import javafx.scene.control.ContentDisplay;
import javafx.scene.control.TableCell;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.util.StringConverter;

public class CurrencyCell<T> extends TableCell<T, Double> {

    private final TextField textField ;

    private final NumberFormat format = DecimalFormat.getCurrencyInstance();
    private final DecimalFormat textFieldFormat = new DecimalFormat("0.00");

    public CurrencyCell() {
        this.textField = new TextField();
        StringConverter<Double> converter = new StringConverter<Double>() {

            @Override
            public String toString(Double object) {
                return object == null ? "" : textFieldFormat.format(object) ;
            }

            @Override
            public Double fromString(String string) {
                try {
                    return string.isEmpty() ? 0.0 : textFieldFormat.parse(string).doubleValue();
                } catch (ParseException e) {
                    e.printStackTrace();
                    return 0.0 ;
                }
            }

        };
        UnaryOperator<Change> filter = (Change change) -> {
            String newText = change.getControlNewText() ;
            if (newText.isEmpty()) {
                return change ;
            }
            try {
                textFieldFormat.parse(newText);
                return change ;
            } catch (ParseException exc) {
                return null ;
            }
        };
        TextFormatter<Double> textFormatter = new TextFormatter<Double>(converter, 0.0, filter);
        textField.setTextFormatter(textFormatter);

        textField.setOnAction(e -> commitEdit(converter.fromString(textField.getText())));
        textField.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
            if (e.getCode() == KeyCode.ESCAPE) {
                cancelEdit();
            }
        });

        setGraphic(textField);
        setContentDisplay(ContentDisplay.TEXT_ONLY);

    }

    @Override
    protected void updateItem(Double item, boolean empty) {
        super.updateItem(item, empty);
        if (empty) {
            setText(null);
            setContentDisplay(ContentDisplay.TEXT_ONLY);
        } else if (isEditing()) {
            textField.setText(item.toString());
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        } else {
            setText(format.format(item));
            setContentDisplay(ContentDisplay.TEXT_ONLY);
        }
    }

    @Override
    public void startEdit() {
        super.startEdit();
        textField.setText(textFieldFormat.format(getItem()));
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        textField.requestFocus();
        textField.selectAll();
    }

    @Override
    public void cancelEdit() {
        super.cancelEdit();
        setText(format.format(getItem()));
        setContentDisplay(ContentDisplay.TEXT_ONLY);
    }

    @Override
    public void commitEdit(Double newValue) {
        super.commitEdit(newValue);
        setContentDisplay(ContentDisplay.TEXT_ONLY);
    }
}

这是一个使用它的示例:

import java.util.Locale ;
import java.util.Random;
import java.util.function.Function;

import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

public class CurrencyCellTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        TableView<Item> table = new TableView<>();
        table.setEditable(true);
        table.getColumns().add(column("Item", Item::nameProperty));
        TableColumn<Item, Double> priceCol = column("Price", item -> item.priceProperty().asObject());
        table.getColumns().add(priceCol);

        priceCol.setCellFactory(tc -> new CurrencyCell<>());

        Random rng = new Random();
        for (int i = 1; i <= 100; i++) {
            table.getItems().add(new Item("Item "+i, rng.nextInt(10000)/100.0));
        }

        primaryStage.setScene(new Scene(table, 600, 600));
        primaryStage.show();
    }

    private static <S,T> TableColumn<S,T> column(String title, Function<S, Property<T>> property) {
        TableColumn<S,T> col = new TableColumn<>(title);
        col.setCellValueFactory(cellData -> property.apply(cellData.getValue()));
        return col ;
    }

    public static class Item {
        private final StringProperty name = new SimpleStringProperty();
        private final DoubleProperty price = new SimpleDoubleProperty();

        public Item(String name, double price) {
            setName(name);
            setPrice(price);
        }

        public final StringProperty nameProperty() {
            return this.name;
        }


        public final String getName() {
            return this.nameProperty().get();
        }


        public final void setName(final String name) {
            this.nameProperty().set(name);
        }


        public final DoubleProperty priceProperty() {
            return this.price;
        }


        public final double getPrice() {
            return this.priceProperty().get();
        }


        public final void setPrice(final double price) {
            this.priceProperty().set(price);
        }



    }

    public static void main(String[] args) {
        // for testing:
        Locale.setDefault(new Locale("NL", "nl"));
        launch(args);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将目标添加到 tableview 单元格内的 collectionview 单元格的按钮

来自分类Dev

将数据添加到excel中的新单元格而不删除前一个单元格

来自分类Dev

在编辑按钮上删除UICollectionView单元格

来自分类Dev

jQuery将动态单元格添加到表中的静态单元格

来自分类Dev

将下面单元格中的值添加到上面的单元格

来自分类Dev

我可以将公式添加到VBA中没有美元符号的单元格吗?

来自分类Dev

动态将项目添加到TableView导致重复的单元格

来自分类Dev

Objc - 用于将单元格添加到 TableView 的 UIAlertController 按钮

来自分类Dev

将子视图添加到选定的 tableview 单元格

来自分类Dev

如何[以编程方式]将图像添加到现有tableView的单元格?

来自分类Dev

如何使用closedxml将符号添加到单元格?

来自分类Dev

如何将可访问性标签添加到已添加到tableview单元格的减号图像中?

来自分类Dev

VBA-双击将x添加到单元格,但是如何双击将其删除?

来自分类Dev

哪个选项更好?直接将子视图添加到单元格中或单元格contentView中?

来自分类Dev

仅将标签添加到单元格上的某些行

来自分类Dev

UICollectionView将图像添加到单元格

来自分类Dev

动态将公式添加到Excel单元格

来自分类Dev

将LookupComboBox添加到CXGrid单元格

来自分类Dev

将列添加到单元格数组

来自分类Dev

无法将单元格添加到行dynamicall

来自分类Dev

将图像添加到单元格

来自分类Dev

将静态单元格添加到UICollectionView

来自分类Dev

OpenXML将单元格添加到WorkSheet

来自分类Dev

Xamarin将TouchRecognizer添加到每个单元格

来自分类Dev

将单元格添加到集合视图。迅速

来自分类Dev

动态将单元格添加到SwiftUI LazyGrid

来自分类Dev

如何将单元格添加到uitableview

来自分类Dev

将按钮添加到单元格

来自分类Dev

将列添加到单元格数组

Related 相关文章

  1. 1

    将目标添加到 tableview 单元格内的 collectionview 单元格的按钮

  2. 2

    将数据添加到excel中的新单元格而不删除前一个单元格

  3. 3

    在编辑按钮上删除UICollectionView单元格

  4. 4

    jQuery将动态单元格添加到表中的静态单元格

  5. 5

    将下面单元格中的值添加到上面的单元格

  6. 6

    我可以将公式添加到VBA中没有美元符号的单元格吗?

  7. 7

    动态将项目添加到TableView导致重复的单元格

  8. 8

    Objc - 用于将单元格添加到 TableView 的 UIAlertController 按钮

  9. 9

    将子视图添加到选定的 tableview 单元格

  10. 10

    如何[以编程方式]将图像添加到现有tableView的单元格?

  11. 11

    如何使用closedxml将符号添加到单元格?

  12. 12

    如何将可访问性标签添加到已添加到tableview单元格的减号图像中?

  13. 13

    VBA-双击将x添加到单元格,但是如何双击将其删除?

  14. 14

    哪个选项更好?直接将子视图添加到单元格中或单元格contentView中?

  15. 15

    仅将标签添加到单元格上的某些行

  16. 16

    UICollectionView将图像添加到单元格

  17. 17

    动态将公式添加到Excel单元格

  18. 18

    将LookupComboBox添加到CXGrid单元格

  19. 19

    将列添加到单元格数组

  20. 20

    无法将单元格添加到行dynamicall

  21. 21

    将图像添加到单元格

  22. 22

    将静态单元格添加到UICollectionView

  23. 23

    OpenXML将单元格添加到WorkSheet

  24. 24

    Xamarin将TouchRecognizer添加到每个单元格

  25. 25

    将单元格添加到集合视图。迅速

  26. 26

    动态将单元格添加到SwiftUI LazyGrid

  27. 27

    如何将单元格添加到uitableview

  28. 28

    将按钮添加到单元格

  29. 29

    将列添加到单元格数组

热门标签

归档