看來你加載動態使用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 –