java访问控制器,JavaFX的 . 从另一个控制器访问一个控制器数据

您似乎使用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" >

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值