您似乎使用FXML Loader动态加载View,因此以下是使用它的规则:
不要使用FXMLLoader的静态方法,使FXMLLoader拥有更多选项(即控制器和节点实例)
从主控制器获取FXMLLoader给出的子控制器实例 .
选择在父子控制器之间操作的常用方法:我提出了一个selectedProperty()方法 .
从接口获取此属性,以便所有子控制器都可以访问它
我使用Property在控制器之间操作,在你的情况下,TableView的selectedProperty应该是理想的解决方案:你可以拥有所选的实例,并且你有选择/取消选择的事件,可以用两种方式:只需绑定它,或添加在tableView中完成的更改的侦听器 .
对于这种情况,绑定就足够了 .
该解决方案涉及许多文件,因此主要技巧如下:从主控制器获取当前子节点的selectedProperty实例,并将其绑定到按钮的visibleProperty,以显示它 .
buttonOpen.disableProperty().bind(controller.selectedProperty().isNull());
您将需要再次在打开按钮的代码中使用selectedProperty
public void open(){
//TODO open in a view
System.out.println("open the object"+selectedProperty().get()
}
完整来源:
Java文件
/**
* App launch
*/
public class SOFx extends Application{
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle ("SO test");
//static loading for index, don't need the controller.
Parent root = FXMLLoader.load(getClass().getResource("Index.fxml"),null);
Scene scene = new Scene(root);
primaryStage.setMaximized(true);
primaryStage.setScene(scene);
primaryStage.show ();
}
}
/**
* Main Controller
*/
public class IndexController {
@FXML
private BorderPane root;
@FXML
private Button buttonOpen;
private ObjectProperty selectedProperty;
public FXMLLoader loadFXML(URL url, ResourceBundle resources){
FXMLLoader fxmlLoader = new FXMLLoader ();
fxmlLoader.setLocation (url);
fxmlLoader.setResources(resources);
try {
fxmlLoader.load ();
return fxmlLoader;
} catch (IOException e) {
e.printStackTrace(System.err);
throw new IllegalStateException(e);
}
}
public void button1(){
FXMLLoader loadFXML = loadFXML(getClass().getResource("View1.fxml"),null);
root.setCenter(loadFXML.getRoot());
ICenterController controller = (ICenterController) loadFXML.getController();
selectedProperty = controller.selectedProperty();
buttonOpen.disableProperty().bind(selectedProperty.isNull());
}
public void open(){
//TODO open in a view
System.out.println("open the object"+selectedProperty.get());
}
}
/**
* Interface of Center controllers
*/
public interface ICenterController {
ObjectProperty selectedProperty();
}
/**
* Child controller
*/
public class View1Controller implements ICenterController {
private static final ObjectProperty selectedProperty = new SimpleObjectProperty();
@Override
public ObjectProperty selectedProperty() {
return selectedProperty;
}
/**
* simulate TableView selection/deselection
*/
public void select(){
selectedProperty.set(new Object());
}
public void deselect(){
selectedProperty.set(null);
}
}
Fxml文件,我不做一个完整的TableView,我用按钮模拟它
Index.fxml
fx:controller="pdem.stackoverflow.IndexController" fx:id="root">
View1.fxml
fx:controller="pdem.stackoverflow.View1Controller" >