JavaFX tableview:默认情况下,在编辑模式下,顶部单元格保存来自下面单元格的数据

JavaFX tableview:默认情况下,在编辑模式下,顶部单元格保存来自下面单元格的数据,java,javafx,Java,Javafx,我对JavaFX相当陌生。我有一个包含多个列和行的表。可以在表格顶部添加新行的位置。编辑单元格也已启用。但我面临一个问题 当我在顶部添加新行并进行编辑时,当编辑开始时,单元格将自动填充下面单元格中的值!!但我不想那样。它是像excel一样的功能吗?如果是,我怎样才能阻止它?这是一张示例图片和我的自定义EditingCell.java 下面是我在表格顶部添加新行的方法 public ObservableList<ModelBrBuilding> BuildingData;// con

我对JavaFX相当陌生。我有一个包含多个列和行的表。可以在表格顶部添加新行的位置。编辑单元格也已启用。但我面临一个问题

当我在顶部添加新行并进行编辑时,当编辑开始时,单元格将自动填充下面单元格中的值!!但我不想那样。它是像excel一样的功能吗?如果是,我怎样才能阻止它?这是一张示例图片和我的自定义
EditingCell.java

下面是我在表格顶部添加新行的方法

public ObservableList<ModelBrBuilding> BuildingData;// contains searched data if there is any in database
//tableBuilding is sorted
// Method for adding new row
@FXML
private void addBuilding() {


        tableBuilding.setEditable(true);
        tableBuilding.getSelectionModel().setCellSelectionEnabled(true);
        colName.setEditable(true);
        //colShortCode.setEditable(true);
        //colActive.setEditable(true);
        if(BuildingData==null)//When search result is empty & there is now row in the table
            {
            tableBuilding.requestFocus();
            tableBuilding.getItems().add(0,new ModelBrBuilding());
            tableBuilding.layout();
            tableBuilding.edit(0, colName);         
            }
    //when search data is not empty 
        else {
        ModelBrBuilding building = new  ModelBrBuilding();

        try {
            BuildingData.add(0,building);
            tableBuilding.layout();
            tableBuilding.edit(0, colName);

            //editBuilding();
        } catch (InstantiationException | IllegalAccessException e) {

            e.printStackTrace();
        }
        }

    }
公共可观察列表BuildingData;//包含搜索的数据(如果数据库中有)
//餐具整理
//添加新行的方法
@FXML
私人楼宇({
tableBuilding.setEditable(true);
tableBuilding.getSelectionModel().setCellSelectionEnabled(true);
colName.setEditable(true);
//colShortCode.setEditable(true);
//colActive.setEditable(true);
if(BuildingData==null)//当搜索结果为空时&表中现在有行
{
tableBuilding.requestFocus();
tableBuilding.getItems().add(0,新模型br building());
tableBuilding.layout();
tableBuilding.edit(0,colName);
}
//当搜索数据不为空时
否则{
modelbrbbuilding=新建modelbrbbuilding();
试一试{
BuildingData.add(0,建筑);
tableBuilding.layout();
tableBuilding.edit(0,colName);
//编辑建筑();
}捕获(实例化异常|非法访问异常e){
e、 printStackTrace();
}
}
}

有谁能帮我这方面的忙吗?

最后,我解决了这个问题。添加新行后,我必须刷新表

@FXML
private void addBuilding() {
    tableBuilding.setEditable(true);
    tableBuilding.getSelectionModel().setCellSelectionEnabled(true);
    colName.setEditable(true);
    //colShortCode.setEditable(true);
    //colActive.setEditable(true);
    if(BuildingData==null)//When search result is empty & there is now row in the table
        {
        tableBuilding.requestFocus();
        tableBuilding.getItems().add(0,new ModelBrBuilding());
        tableBuilding.refresh();
        tableBuilding.layout();
        tableBuilding.edit(0, colName);         
        }
//when search data is not empty 
    else {
    ModelBrBuilding building = new  ModelBrBuilding();

    try {
        BuildingData.add(0,building);
        tableBuilding.refresh();
        tableBuilding.layout();
        tableBuilding.edit(0, colName);

        //editBuilding();
    } catch (InstantiationException | IllegalAccessException e) {

        e.printStackTrace();
    }
    }

}

您还应该包括创建
TableView
的代码以及用于添加新行的表的控制器。@wallek876现在我已经包括了相关代码。我发现了两个可能与您的问题有关或可能与您的问题无关的问题:即使它不是问题的根源,也可能发生以下情况,因为您没有在每次调用
startEdit
方法1时设置初始文本。单元格编辑为2。完成编辑后,项目将被替换3。开始编辑包含新项的单元格。
TextField
中的文本仍然包含上次提交编辑时包含的文本。顺便说一句:您的
onEditCommit
方法只需将对项的引用存储在局部变量中,而不是使用相同的表达式反复检索它即可获益:''modelbrbbuilding item=(modelbbuilding)getTableView().getItems().get(t.getTablePosition().getRow());oldName=item.getBranchName();项目名称(…);。。。'@fabian我在我的
onEditCommit
方法中更改为modelbr构建
item=(modelbr构建)t.getTableView().getItems().get(t.getTablePosition().getRow());oldName=item.getBranchName()item.setBranchName(oldName)startEdit
方法有什么建议?
public ObservableList<ModelBrBuilding> BuildingData;// contains searched data if there is any in database
//tableBuilding is sorted
// Method for adding new row
@FXML
private void addBuilding() {


        tableBuilding.setEditable(true);
        tableBuilding.getSelectionModel().setCellSelectionEnabled(true);
        colName.setEditable(true);
        //colShortCode.setEditable(true);
        //colActive.setEditable(true);
        if(BuildingData==null)//When search result is empty & there is now row in the table
            {
            tableBuilding.requestFocus();
            tableBuilding.getItems().add(0,new ModelBrBuilding());
            tableBuilding.layout();
            tableBuilding.edit(0, colName);         
            }
    //when search data is not empty 
        else {
        ModelBrBuilding building = new  ModelBrBuilding();

        try {
            BuildingData.add(0,building);
            tableBuilding.layout();
            tableBuilding.edit(0, colName);

            //editBuilding();
        } catch (InstantiationException | IllegalAccessException e) {

            e.printStackTrace();
        }
        }

    }
@FXML
private void addBuilding() {
    tableBuilding.setEditable(true);
    tableBuilding.getSelectionModel().setCellSelectionEnabled(true);
    colName.setEditable(true);
    //colShortCode.setEditable(true);
    //colActive.setEditable(true);
    if(BuildingData==null)//When search result is empty & there is now row in the table
        {
        tableBuilding.requestFocus();
        tableBuilding.getItems().add(0,new ModelBrBuilding());
        tableBuilding.refresh();
        tableBuilding.layout();
        tableBuilding.edit(0, colName);         
        }
//when search data is not empty 
    else {
    ModelBrBuilding building = new  ModelBrBuilding();

    try {
        BuildingData.add(0,building);
        tableBuilding.refresh();
        tableBuilding.layout();
        tableBuilding.edit(0, colName);

        //editBuilding();
    } catch (InstantiationException | IllegalAccessException e) {

        e.printStackTrace();
    }
    }

}