我正在做一个JavaFx项目。我有一个表格视图,其中包含几个名称(例如BG Manager,User Management,Find Acl,....)。每次我点击这些名称中的每一个(或该表的每一行)时,它都会打开一个新标签,再次填充我之前列出的信息。这是一个示例函数,一旦我点击一个名为BG Management的行就被调用:
private void callBGManager(){
try {
Tab tab = new Tab ();
FXMLLoader bgm = new FXMLLoader(getClass().getResource("/views/BGMWindow.fxml"));
BGMController bgmc = new BGMController(_session);
bgm.setController(bgmc);
Parent root = bgm.load();
for (Tab tabs : TabPane1.getTabs()){
if (tabs.getText().equals(ListView1.getSelectionModel().getSelectedItem())){
SingleSelectionModel<Tab> selectionModel = TabPane1.getSelectionModel();
selectionModel.select(tab);
return;
}
}
tab.setContent(root);
tab.setText(ListView1.getSelectionModel().getSelectedItem());
tab.closableProperty().set(true);
TabPane1.setTabClosingPolicy(TabPane1.getTabClosingPolicy().SELECTED_TAB);
TabPane1.getTabs().add(tab);
SingleSelectionModel<Tab> selectionModel = TabPane1.getSelectionModel();
selectionModel.select(tab);
}catch(Exception e){
e.printStackTrace();
}
}
编译或操作此代码没有问题,因为它运行良好。以下是更好地了解情况的情景。我可以在我的列表中说5行,每次点击它们,如果它还没有打开,它会显示出来,如果它已经打开,没有任何反应。假设我已经在另一个选项卡视图中,并且BG Manager已经打开。点击它后,如何切换到BG Manager :)
答案 0 :(得分:0)
你好Danial你可以使用(row)cell.setUserData();
和deafult set为每个真值。并点击此行(单元格),您应该检查此数据(row)cell.getUserData();
,如果它是真的,则将其更改为false,而在另一个案例中打开窗口则不执行任何操作。
示例:强>
table.setRowFactory( tv -> {
TableRow<MyType> row = new TableRow<>();
row.setOnMouseClicked(event ->{
boolean result = (boolean) row.getUserData();
if(result){
row.setUserData(false);
//There will be your method to open new window
methodToOpenNewWindow(row);
}else{
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Information");
alert.setContentText("This entity already was opened.");
alert.show();
}
});
return row ;
});
在关闭窗口的方法methodToOpenNewWindow
中,将行userData
设置为true。