社区首页 >问答首页 >向表视图中添加货币符号,但在编辑单元格上删除

向表视图中添加货币符号,但在编辑单元格上删除
EN

Stack Overflow用户
提问于 2016-03-18 07:14:06
回答 1查看 1.9K关注 0票数 3

我已经知道如何使用表单元工厂回调来操作表单元格。我在单元格中添加了一个货币符号,以使其看起来整洁。(即5,00欧元,而不是5,00欧元)问题是,当我双击单元格时,我希望删除该符号。但令人费解的是,当用户提交编辑时,我无法找到如何再次操作textfield来删除该货币符号并将其带回来。基本上,当我在Excel :中编辑一个单元格时,我试图做的是类似的事情。

有人能帮我举个简单的例子吗?我需要使用OnEditStart事件吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-18 11:00:48

在不更改实际数据的情况下,每当您想配置单元格中的项如何显示时,都应该使用自定义TableCell。下面是一个展示您想要的行为的示例:

代码语言:javascript
代码运行次数:0
复制
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);
    }
}

下面是一个使用它的例子:

代码语言:javascript
代码运行次数:0
复制
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);
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36087968

复制
相关文章
利用api向小程序地图中添加marker
在某些小程序中我们需要将一些地点的位置标记出来。之前我们也发过有关marker添加的文章,今天在此技术的基础上利用api向其中填加maker。
算法与编程之美
2022/05/23
1.1K0
利用api向小程序地图中添加marker
UITableView 编辑状态(删除、添加、移动)
----- TableView 删除和添加 ----- ** UITableView 编辑步骤 1.让 tableView 处于编辑状态 2.协议确定 1)确定 cell 是否处于编辑状态 2)设定 cell 的编辑样式(删除、添加) 3) 编辑状态进行提交** 开启编辑状态 //1.让 tableView 处于编辑状态 [tableView setEditing:YES animated:YES]; 如果
LeeCen
2018/10/11
1.5K0
UITableView 编辑状态(删除、添加、移动)
Excel表格的35招必学秘技[配图]
一、让数据按需排序   如果你要将员工按其所在的部门进行排序,这些部门名称既的有关信息不是按拼音顺序,也不是按笔画顺序,怎么办?可采用自定义序列来排序。   1.执行“格式→选项”命令,打开“选项”
ytkah
2018/03/06
7.6K0
Excel表格的35招必学秘技[配图]
laravel 模型Eloquent ORM 添加编辑删除
一般是前端传过来数据存到数据库,模型有一个 create 方法就是用来新增数据的,up 建个 store 方法
风清醉
2019/12/18
1.7K0
【测试】因果图中的基本符号
文章目录 因果图 基本符号 符号详解 其他条件约束 栗子 栗子-售货机场景 因果图判定表 因果图法基本步骤 判定表法 栗子-好学生 思考 因果图 基本符号 符号详解 其他条件约束 栗子 栗子-售货机场
瑞新
2020/07/07
9640
【测试】因果图中的基本符号
Swift - 给TableView添加编辑功能(删除,插入)
1,下面的样例是给表格UITableView添加编辑功能: (1)给表格添加长按功能,长按后表格进入编辑状态 (2)在编辑状态下,第一个分组处于删除状态,第二个分组处于插入状态 (3)点击删除图标,删除对应条目 (4)点击添加图标,插入一条新数据
Python疯子
2018/09/06
3K0
Swift - 给TableView添加编辑功能(删除,插入)
Oracle创建表、删除表、修改表(添加字段、修改字段、删除字段)语句总结
关于Oracle创建表、删除表、修改表(添加字段、修改字段、删除字段)语句的简短总结。
星哥玩云
2022/08/18
3.7K0
安全删除MySQL大表(上)
日期:2018/4/12 介绍:工具用于安全删除MySQL表,对于一些特定场景可能有用
陈不成i
2021/06/16
4.6K0
HTML UTF-8 货币符号
<p>我将显示 &euro;<p> <p>我将显示 &#8364;<p> <p>我将显示 &#x20AC;<p>
用户4047016
2019/11/05
2.5K0
HTML UTF-8 货币符号
提高效率 |ArcGIS Pro 中所有快捷键一网打尽
这是 ArcGIS Pro 中可用的键盘快捷键的完整列表,并且在每个软件版本中都会更新。可以从 https://links.esri.com/arcgis-pro-shortcuts 下载 PDF 版本。
陈南GISer
2023/08/19
1.3K0
提高效率 |ArcGIS Pro 中所有快捷键一网打尽
在 Linux 上查找和删除损坏的符号链接
符号链接(symbolic link)在 Linux 系统上扮演了非常有用的角色。它们可以帮助你记住重要文件在系统上的位置,使你更容易访问这些文件,并让你不必为了更方便访问大文件而复制它们,从而节省了大量的空间。
用户9104802
2021/11/22
2.6K0
R语言绘图中添加公式
R语言在作图时难免会用到公式,往途中添加标签公式的方法有很多,R基础包自带的expression函数就是一个,除此之外还有latex2exp可以在R语言中使用latex的命令来给图片添加公式。本文基于expression函数常用的命令从常用的运算符、大型运算、集合运算、希腊字母等方面给出常用的公式命令。
拴小林
2021/10/11
2K0
R语言绘图中添加公式
国际化之货币符号显示
我发现手机上显示的货币符号跟实际遇到的可能不一样,为此我逐一查询了不同国家/地区的显示。大部分是确定的,有几个国家不太确定。
meteoric
2018/11/20
1.4K0
表格插件-bootstrap table的表内查看编辑删除
基于 Bootstrap 的 jQuery 表格插件,通过简单的设置,就可以拥有强大的单选、多选、排序、分页,以及编辑、导出、过滤(扩展)等等的功能。
王小婷
2018/12/13
3.5K0
表格插件-bootstrap table的表内查看编辑删除
JavaScript | 数组的splice()方法,向/从数组添加/删除项目,并返回删除的项目
JavaScript代码: /* * splice() 方法向/从数组添加/删除项目,并返回删除的项目。 * 注释:splice() 方法会改变原始数组。 * 语法:array.splice(index, howmany, item1, ....., itemX) * index:必需。整数,指定在什么位置添加/删除项目,使用负值指定从数组末尾开始的位置。 * howmany:可选。要删除的项目数。如果设置为 0,则不会删除任何项目。 * item1, ...
倾盖
2022/08/16
3.3K0
JavaScript | 数组的splice()方法,向/从数组添加/删除项目,并返回删除的项目
如何在Debian 8上添加和删除用户
您应该知道如何在新的Linux服务器上执行的最基本任务之一是添加和删除用户。创建新系统时,默认情况下通常只会为您提供root帐户。虽然以root用户身份运行会为您提供强大的功能和灵活性,但它也很危险并且具有破坏性。添加额外的,无特权的用户来执行常见任务几乎总是更好的主意。然后,您应该为系统上可能拥有的任何其他用户创建其他帐户。
水门
2018/09/19
3.3K0
如何在 CentOS 8 上添加和删除用户
在配置一台新的Linux 服务器时,第一件事情就是添加或者移除用户。每一个用户都有不同的权限级别,和针对各种命令行,应用程序的指定设置。
雪梦科技
2020/05/09
8.4K0
如何在 CentOS 8 上添加和删除用户
如何在Ubuntu 16.04上添加和删除用户
您应该知道最基本任务之一是如何在新的Linux服务器上添加和删除用户。当您创建新系统时,您通常(例如在DigitalOcean Droplets上)默认情况下仅提供root帐户。
一步
2018/09/18
6K0
Mongodb 删除添加分片与非分片表维护
 更新时间:2016年01月15日 09:10:01   作者:aqszhuaihuai   
拓荒者
2019/09/12
1.4K0
点击加载更多

相似问题

向`TextBlock`添加货币符号

40

如何在树形视图中添加货币符号?

20

删除货币符号

311

Swift/Xcode -向UITextField添加货币符号和逗号

10

删除货币符号PHP

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文