看来你加载动态使用FXML装载机查看,所以这里是使用它的规则:
- 不要使用FXMLLoader的静态方法,intanciate的FXMLLoader对它有更多的选择(即控制器&节点实例)
- 从主控制器获取由FXMLLoader给出的子控制器实例。
- 选择在父子控制器之间操作的常用方法:我提出了一个selectedProperty()方法。
- 获取从一个接口这个属性,因此它是所有子控制器访问
我用房产控制器之间进行操作,你的情况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<Object> 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<Object> selectedProperty();
}
/**
* Child controller
*/
public class View1Controller implements ICenterController {
private static final ObjectProperty<Object> selectedProperty = new SimpleObjectProperty();
@Override
public ObjectProperty<Object> selectedProperty() {
return selectedProperty;
}
/**
* simulate TableView selection/deselection
*/
public void select(){
selectedProperty.set(new Object());
}
public void deselect(){
selectedProperty.set(null);
}
}
FXML文件,我不做一个完整的TableView,我用按钮模拟它
Index.fxml
<BorderPane xmlns="http://javafx.com/javafx/8.0.51" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="pdem.stackoverflow.IndexController" fx:id="root">
<left>
<VBox>
<Button onAction="#button1" text="view1"/>
<Button fx:id="buttonOpen" text="open"/>
</VBox>
</left>
</BorderPane>
View1.fxml
<VBox xmlns="http://javafx.com/javafx/8.0.51" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="pdem.stackoverflow.View1Controller" >
<Button onAction="#select" text="select"/>
<Button onAction="#deselect" text="deselect"/>
</VBox>
见http://stackoverflow.com/questions/32342864/applying-mvc-with-javafx –