我一直在尝试添加一个删除按钮,以便删除我的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;
有几点需要注意:
projectTableStorage.getProj()
用于存储每个表中的所有数据,返回的值是ObservableList,我使用它来设置表的项,只要加载该接口,所以数据是在接口之间交换时没有丢失,也许有更有效的方法来解决它,这就是我的做法
这些界面中有7个,我只是用2进行测试,目前至少使测试变得更短更简单
编辑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类中的可观察列表再次放入表中