社区首页 >问答首页 >如何使数据类型为Integer的表列可编辑,而不将其更改为字符串

如何使数据类型为Integer的表列可编辑,而不将其更改为字符串
EN

Stack Overflow用户
提问于 2015-01-12 10:54:06
回答 2查看 11K关注 0票数 6

我有一个数据类型为Integer的表列。我希望在不将数据类型更改为String的情况下使该列可编辑。我使用了textfieldtablecell,但它只在按enter键时提交值。所以我想要一些其他的方法。请给我一些建议。为了使它成为可能,我已经做了这样的事情。但我的单元格无法编辑。

代码语言:javascript
代码运行次数:0
复制
public class EditCell implements initializable{

 @FXML
    private TableView<ResourceMaster> roletable;  
@FXML
    private TableColumn<ResourceMaster, Integer> loadedHrs;
@Override
    public void initialize(URL location, ResourceBundle resources) {

Callback<TableColumn<ResourceMaster,Integer>, TableCell<ResourceMaster,Integer>> txtCellFactory = 
                (TableColumn<ResourceMaster,Integer> p) -> {return new EditingCell();};

loadedHrs.setCellFactory(txtCellFactory);
} 

   public class EditingCell extends TableCell<ResourceMaster, Integer> {
        private TextField textField;
        @Override
        public void startEdit() {
            if (!isEmpty()) {
                super.startEdit();
                if (textField == null) {
                    createTextField();
                }
               // setText(null);
                commitEdit(Integer.valueOf((textField.getText())));
                setGraphic(textField);
                setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                textField.requestFocus();
            }
        }

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

        @Override
        public void updateItem(Integer item, boolean empty) {
            super.updateItem(item, empty);
            if (empty) {
                //setText(null);
                setGraphic(null);
            } else {
                if (isEditing()) {
                    if (textField != null) {
                        textField.setText(String.valueOf(getString()));
                    }
                    setGraphic(textField);
                    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                } else {
                    setText(String.valueOf(getString()));
                    setContentDisplay(ContentDisplay.TEXT_ONLY);
                }
            }
        }

        private void createTextField() {
            textField = new TextField(String.valueOf(getString()));
            textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
            textField.setOnKeyPressed(new EventHandler<KeyEvent>() {
                @Override
                public void handle(KeyEvent t) {
                    if (t.getCode() == KeyCode.ENTER) {
                        commitEdit(Integer.valueOf(textField.getText()));
                        EditingCell.this.getTableView().requestFocus();//why does it lose focus??
                        EditingCell.this.getTableView().getSelectionModel().selectBelowCell();
                    } else if (t.getCode() == KeyCode.ESCAPE) {
                        cancelEdit();
                    }
                }
            });

            textField.setOnKeyReleased(new EventHandler<KeyEvent>() {
                @Override
                public void handle(KeyEvent t) {
                    if (t.getCode().isDigitKey()) {
                        if (CellField.isLessOrEqualOneSym()) {
                            CellField.addSymbol(t.getText());
                        } else {
                            CellField.setText(textField.getText());
                        }
                        textField.setText(CellField.getText());
                        textField.deselect();
                        textField.end();
                        textField.positionCaret(textField.getLength() + 2);//works sometimes

                    }
                }
            });
        }

        private Integer getString() {
            return getItem();
        }
}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-13 05:28:11

只需使用在编辑时在单元格中创建文本字段的单元格工厂即可。要提交编辑,只需解析文本字段中的文本即可。

示例:

代码语言:javascript
代码运行次数:0
复制
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.regex.Pattern;

import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class EditableTableColumnWithInteger extends Application {

    @Override
    public void start(Stage primaryStage) {
        TableView<Item> table = new TableView<>();
        table.setEditable(true);
        table.getItems().addAll(createData());

        TableColumn<Item, String> nameCol = new TableColumn<>("Name");
        nameCol.setCellValueFactory(cellData -> cellData.getValue().nameProperty());

        TableColumn<Item, Number> valueCol = new TableColumn<>("Value");
        valueCol.setCellValueFactory(cellData -> cellData.getValue().valueProperty());

        valueCol.setCellFactory(col -> new IntegerEditingCell());

        table.getColumns().add(nameCol);
        table.getColumns().add(valueCol);

        Button dataDumpButton = new Button("Dump data");
        dataDumpButton.setOnAction( e -> 
            table.getItems().stream().map(item -> item.getName()+":"+item.getValue()).forEach(System.out::println));
        HBox controls = new HBox(5, dataDumpButton);
        controls.setPadding(new Insets(10));
        controls.setAlignment(Pos.CENTER);

        primaryStage.setScene(new Scene(new BorderPane(table, null, null, controls, null), 600, 400));
        primaryStage.show();
    }

    public class IntegerEditingCell extends TableCell<Item, Number> {

        private final TextField textField = new TextField();
        private final Pattern intPattern = Pattern.compile("-?\\d+");

        public IntegerEditingCell() {
            textField.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> {
                if (! isNowFocused) {
                    processEdit();
                }
            });
            textField.setOnAction(event -> processEdit());
        }

        private void processEdit() {
            String text = textField.getText();
            if (intPattern.matcher(text).matches()) {
                commitEdit(Integer.parseInt(text));
            } else {
                cancelEdit();
            }
        }

        @Override
        public void updateItem(Number value, boolean empty) {
            super.updateItem(value, empty);
            if (empty) {
                setText(null);
                setGraphic(null);
            } else if (isEditing()) {
                setText(null);
                textField.setText(value.toString());
                setGraphic(textField);
            } else {
                setText(value.toString());
                setGraphic(null);
            }
        }

        @Override
        public void startEdit() {
            super.startEdit();
            Number value = getItem();
            if (value != null) {
                textField.setText(value.toString());
                setGraphic(textField);
                setText(null);
            }
        }

        @Override
        public void cancelEdit() {
            super.cancelEdit();
            setText(getItem().toString());
            setGraphic(null);
        }

        // This seems necessary to persist the edit on loss of focus; not sure why:
        @Override
        public void commitEdit(Number value) {
            super.commitEdit(value);
            ((Item)this.getTableRow().getItem()).setValue(value.intValue());
        }
    }

    private List<Item> createData() {
        Random rng = new Random();
        List<Item> items = new ArrayList<>();
        for (int i=1; i<=20; i++) {
            items.add(new Item("Item "+i, rng.nextInt(20)));
        }
        return items ;
    }

    public static class Item {
        private final StringProperty name = new SimpleStringProperty();
        private final IntegerProperty value = new SimpleIntegerProperty();
        public Item(String name, int value) {
            this.setName(name);
            this.setValue(value);
        }
        public final StringProperty nameProperty() {
            return this.name;
        }
        public final java.lang.String getName() {
            return this.nameProperty().get();
        }
        public final void setName(final java.lang.String name) {
            this.nameProperty().set(name);
        }
        public final IntegerProperty valueProperty() {
            return this.value;
        }
        public final int getValue() {
            return this.valueProperty().get();
        }
        public final void setValue(final int value) {
            this.valueProperty().set(value);
        }

    }

    public static void main(String[] args) {
        launch(args);
    }
}
票数 10
EN

Stack Overflow用户

发布于 2019-06-08 18:27:28

你可以用StringConverter创建表格单元格,它会将你的对象转换成单元格表示。你可以为你的类实现自己的StringConverter

代码语言:javascript
代码运行次数:0
复制
cell.setCellFactory(TextFieldTableCell.forTableColumn(new StringConverter<AnyClass>() {

        @Override
        public String toString(AnyClass object) {
            return null;
        }

        @Override
        public AnyClass fromString(String string) {
            return null;
        }
    }));

此外,JavaFX还包含一些默认的转换器。例如,你的案例中的IntegerStringConverter,

代码语言:javascript
代码运行次数:0
复制
TextFieldTableCell.forTableColumn(new IntegerStringConverter())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27900344

复制
相关文章
在不同 webpack 版本的 Vue 项目中配置 Storybook
在之前的一篇文章中,介绍过组件化搭建工具 storybook 在 vue 项目中的安装和配置。相比于其成文的时间,vue 项目依赖的工具多有发展;并且在实际应用中,多种历史版本的项目并存的状况比比皆是,用官方提供的 npx sb init 往往会出现配置失败的情况,而较新或过旧的资料都在网上难觅 -- 所以在此特别补充一篇,记录 新、旧 两种典型配置下,storybook 可用的手动配置方法: 1. babel7 + webpack5 1.1 安装过程 diff --git a/.babelrc b/.b
江米小枣
2021/04/29
1K0
sbt 项目导入问题
有用过 sbt 开发项目的同学应该都有这样的体会,换个环境,sbt 经常会出现编译项目出错的情况,导入 IDEA 又各种报错,尤其是在 github 上找到一个 sbt 编译的项目,想 clone 下来导入 IDEA 中阅读源码,跑跑测试用例,debug 进去看看实现原理等等…
runzhliu
2020/08/05
2.5K0
PHP在同一域名下两个不同的项目做独立登录机制详解
前言 目前有这样一个需求,在一个域名下 如:http/【php教程_linux常用命令_网络运维技术】/://example.com 下,有两个项目,example.com/a/,example.com/b/,这两个项目是相互独立的程序,有不同的会员登录机制,但是我们知道,在同一个域名下,它的 session 会话是共享的,也就是你在a站登录后,b站也会出现你在a站的session信息,因为默认的 session_id 名字是 PHPSESSID,即当你第一访问a项目时,它会自动生成一个名为 PHPSESSID 的session_id,并在服务器端创建一个以session_id 命名的文件,然后发送session_id到浏览器的cookie里保存,当下一次访问时,则会携带该 cookie 信息,服务器端拿到session_id,然后再继续会话。这样就会出现会话信息共享的局面,应该怎样独立出两个不同的会话信息呢?
用户2323866
2021/07/08
1K0
MySQL数据库中有哪些不同的表格?
在 MySQL 中,数据表是一个或多个字段的集合(有组织排列),并且每个字段可以存储特定的类型数据。常见的 MySQL 表格有以下几种:
用户1289394
2023/08/22
2760
MySQL数据库中有哪些不同的表格?
SBT入门
我们用IDEA创建Spark项目的时候,默认都是使用SBT作为构建工具的,那么SBT是个啥?
码客说
2022/05/17
1.1K0
ubuntu的不同版本
ubuntu是现在最流行的Linux安装包,本文介绍了ubuntu的各种版本。 一、Ubuntu 每个ubuntu的版本都包含一个版本号(version number)和一个代码名(code name
ruanyf
2018/04/13
2.4K0
ubuntu的不同版本
一个ip, 两个域名, 两个ssl, 访问多个不同的项目
在前面一篇中说过, 入了好几个坑. 后来使用了nginx+tomcat配置的方式. 终于成功了. 因为头一次使用nginx, 不知道具体怎么操作, 于是我在操作的时候, 按照以下几个步骤执行的:
用户7798898
2020/09/27
3.9K0
一个ip, 两个域名, 两个ssl, 访问多个不同的项目
Spring框架中有哪些不同类型的事件
如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。 
红目香薰
2022/11/29
3500
centos 安装sbt
1.yum install sbt 2.如果不行,则 curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.repo sudo mv bintray-sbt-rpm.repo /etc/yum.repos.d/ sudo yum install sbt sbt 二进制文件发布到 Bintray,而Bintray 方便地提供了RPM资源库。你只需要将存储库添加到你的软件包管理器将检查的地方。 3.手动安装,目前官网提供的是可以直接运行的地址:http:/
hbbliyong
2018/03/06
4K0
.NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
最近我大幅度重构了我一个库的项目结构,使之使用最新的项目文件格式(基于 Microsoft.NET.Sdk)并使用 SourceYard 源码包来打包其中的一些公共代码。不过,最终生成了一个新的 dll 之后却心有余悸,不知道我是否删除或者修改了某些 API,是否可能导致我原有库的使用者出现意料之外的兼容性问题。
walterlv
2023/10/22
3630
.NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
在RPA项目中有哪些文档,如何使用这些文档
RPA项目也同样遵循同样的方式,不同的厂商和公司定义的文档类型也不太相同,多的可能十几种,少的也要几种,具体的遵循方式和使用标准取决于公司内部的使用章程。
RPA小葵
2020/03/16
1.1K0
在RPA项目中有哪些文档,如何使用这些文档
新增非空约束字段在不同版本中的演进
开发提了一个数据库变更需求,新增一字段,没有NOT NULL非空约束,但有默认值为NULL。看起来有些奇怪,因为若字段允许NULL,其默认值就是NULL,不用显示声明,可以创建一个无DEFAULT NULL的新增字段再查看desc表结构,就可以证明这点。
bisal
2019/01/29
3.1K0
RStuido Server 选择不同的 R 版本(conda 中的不同 R 版本)
自从上一次服务器重装系统之后,总感觉缺少了一些东西,安装R包很多依赖库报错,也可以解决,但总是存在,烦。
章鱼猫先生
2021/10/15
4.1K0
RStuido Server 选择不同的 R 版本(conda 中的不同 R 版本)
下载不同版本的xcode
1.连接xcode官网下载连接 注:需要苹果开发账号登录 2.搜索 xcode image.png 3.选择自己需要的xcode 版本然后下载 image.png 如果想要多个xcode 版本都
用户1437675
2019/02/22
1.3K0
下载不同版本的xcode
一个ip, 两个域名, 两个ssl, 对应多个不同的项目 之 坑
之前配置了好几天, 就想通过tomcat直接配置. 找各种资料, 都说先配置Connector, 在配置Host. 我试了很多次, 都不成功. 原因我也没有找到在哪里. 我的配置参考如下网址:
用户7798898
2020/09/27
2.2K0
一个ip, 两个域名, 两个ssl, 对应多个不同的项目  之   坑
sbt快速入门
sbt类似与maven, gradle的项目管理工具,主要用在scala,也可以用在java项目,本文介绍一下常用的使用命令和语法 安装 mac brew install sbt redhat&centos # remove old Bintray repo file sudo rm -f /etc/yum.repos.d/bintray-rpm.repo curl -L https://www.scala-sbt.org/sbt-rpm.repo > sbt-rpm.repo sudo mv sbt
十毛
2021/11/24
1.1K0
惊艳 | RStuido server选择不同的R版本(conda中的不同R版本)
自从上一次服务器重装系统之后,总感觉缺少了一些东西,安装R包很多依赖库报错,也可以解决,但总是存在,烦。
用户7010445
2021/07/12
10.5K5
惊艳 | RStuido server选择不同的R版本(conda中的不同R版本)
考古 dotnet 的不同版本
本文来考古一下 dotnet 发布过的版本,相信本文里面有很多个版本都是大家很少听过的
林德熙
2021/05/27
6260
在Java中为什么不同的返回类型不算方法重载?
方法重载是指在同一个类中,定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是方法重载。 比如以下 4 个 method 方法就可以称之为方法重载,如下代码所示:
磊哥
2022/01/20
3.4K0
在Java中为什么不同的返回类型不算方法重载?
编译工具sbt部署
项目构建工具是项目开发中非常重要的一个部分,充分利用好它能够极大的提高项目开发的效率。在学习SCALA的过程中,我遇到了SBT(Simple Build Tool), SBT是SCALA 平台上标准的项目构建工具,当然你要用它来构建其他语言的项目也是可以的。
陈不成i
2021/05/28
8570

相似问题

sbt无法在项目中导入两个不同版本的elasticsearch库

150

SBT:两个不同依赖项的Scala版本的交叉构建项目

13

SBT多项目构建:针对不同子项目的2种不同版本的sbt play插件

12

为什么sbt要下载与build.sbt版本不同的Scala版本?

10

如何指定rails版本?我在不同的项目中有不同的版本

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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