如何删除TableView中的行javafx

时间:2015-06-03 07:54:54

标签: java javafx initialization tableview javafx-8

我一直在尝试添加一个删除按钮,以便删除我的tableview中的选定行。我的问题与我在别处找到的问题略有不同。我的问题在于,在我的应用程序中,我使用了1个FXML文件作为几个不同接口的基础。当我初始化其中一个并使用删除按钮的功能时,它会删除tableView行以及它应该如何。但是当我初始化第二个接口(仍然使用相同的FXML和从此相同的变量名称)时,它只允许我删除第二个tableView中的项而不是第一个。我知道为什么会这样,但我不知道如何解决它。

以下是我尝试的一些方法:

public void removeProject(ActionEvent event){
int index = projectTable.getSelectionModel().getSelectedIndex();
  if(index >=0){
  projectTable.getItems().remove(index);
  }else
  //Show warning
  }
}

另一种不同的方法:

public void removeProject(ActionEvent event){
ObservableList<Project> currentlySelected, allProjects;
currentlySelected = projectTable.getSelectionModel().getSelectedIndex();
allProjects = projectTable.getItems();
currentlySelected.forEach(allProjects::remove);
}

另请注意,在初始化第二个tableView之前,这两种方法都可以正常工作。在此之后,当我尝试在表中选择不是最新的接口初始化的行时,我从ObservableList<Project> currentlySelected和我的int Index得到的值都是-1。对不起,如果它听起来有点令人困惑,但它有点令人困惑,如果我能清除任何不适,请稍后添加编辑

干杯

编辑1:

这是一个例子,我试图根据它当前的界面从表中删除:

ObservableList<Project> itemsSelected; 
        switch(counter){
        case 1:
            itemsSelected = projectTable.getSelectionModel().getSelectedItems();
            itemsSelected.forEach(projTableStorage.getProj1()::remove);
            break;
        case 2:
            itemsSelected = projectTable.getSelectionModel().getSelectedItems();
            itemsSelected.forEach(projectTableStorage.getProj2()::remove);
            break; 

有几点需要注意:

  1. projectTableStorage.getProj()用于存储每个表中的所有数据,返回的值是ObservableList,我使用它来设置表的项,只要加载该接口,所以数据是在接口之间交换时没有丢失,也许有更有效的方法来解决它,这就是我的做法

  2. 这些界面中有7个,我只是用2进行测试,目前至少使测试变得更短更简单

  3. 编辑2:

    加载FXML文件:

    public AnchorPane initLayouts(FXMLLoader loader, AnchorPane projectLayout, MainLayoutController mainLay) throws IOException{
        loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("/control/view/ProjectLayout.fxml"));
        loader.setController(mainLay);
        projectLayout = (AnchorPane) loader.load();
        return projectLayout;
    }
    
    MainLayoutController中的

    public AnchorPane loadLayout(AnchorPane projectLayout, Project project, FXMLLoader loader)throws IOException{
        projectLayout = project.initLayouts(loader, projectLayout, this);
        return projectLayout;
    }
    
    只要按下按钮,就会调用

    加载布局

    编辑3:

    以下是'removeProjec'代码

    public void removeProject(ActionEvent event){
        ObservableList<Project> itemsSelected, currentProject; 
        itemsSelected = getProjectTable().getSelectionModel().getSelectedItems();
        itemsSelected.forEach(getProjectTable().getItems()::remove);
        System.out.println("value of itemsSelected is : " + itemsSelected);
    }
    

    和我的项目表存储:

    ObservableList<Project> project1= FXCollections.observableArrayList(); 
    ObservableList<Project> project2 = FXCollections.observableArrayList(); 
    
    public void setProject1(Project project){
        project1.add(project);
    }
    
    public void setProject2(Project project){
        project2.add(project);
    }
    
    public ObservableList<Project> getProject1(){
        return project1;
    }
    public ObservableList<Project> getProject2(){
        return project2;
    }
    

    并且以防getProjectTable方法(使用和不使用注释尝试):

    @FXML
    public TableView<Project> getProjectTable(){
        return projectTable;
    }
    

    编辑4:

    public void createNewProjectLayout(ActionEvent event) throws IOException{
    
        if(event.getTarget() == newProjectLayoutButton1){
            projectLayout1 = loadOrReloadProjectLayout(newProjectLayoutButton1, project1, projectLayout1, 1);
            setTable(Counter);
    
        }else if(event.getTarget() == newProjectLayoutButton2){
            projectLayout2 = loadOrReloadProjectLayout(newProjectLayoutButton2, project2, projectLayout2, 2);
            setTable(Counter);
    
        }
    

    有几点需要注意:

    loadOrReload只是在第一次使用前面提到的loadLayout方法单击时加载文件,然后在下次按下时重新加载loadLayout的结果

    setTable用于将先前存储在表中的任何数据设置为使用ProjectTableStorage类中的可观察列表再次放入表中

0 个答案:

没有答案