Javafx 2 如何从主控制器跨两个fxml绑定控件

Javafx 2 如何从主控制器跨两个fxml绑定控件,javafx-2,Javafx 2,我需要在主控制器中绑定来自不同fxml的控件。 我有3个名为MainView.fxml、ChildView1.fxml和ChildView2.fxml的fxml文件 MainView.fxml <AnchorPane fx:id="view" prefHeight="280.0" prefWidth="500.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="

我需要在主控制器中绑定来自不同fxml的控件。 我有3个名为MainView.fxml、ChildView1.fxml和ChildView2.fxml的fxml文件

MainView.fxml

<AnchorPane fx:id="view" prefHeight="280.0" prefWidth="500.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="binding.example2.MainViewController">
<children>
<VBox prefHeight="280.0" prefWidth="500.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
  <children>
    <fx:include fx:id="child1" source="ChildView1.fxml" />
    <fx:include fx:id="child2" source="ChildView2.fxml" />
  </children>
</VBox>
</children>
</AnchorPane>
<AnchorPane fx:id="view" prefHeight="78.0" prefWidth="464.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="binding.example2.ChildView1Controller">
<children>
<HBox layoutX="32.0" layoutY="14.0" prefHeight="51.0" prefWidth="200.0" spacing="10.0">
 <children>
    <Button fx:id="button1" mnemonicParsing="false" prefHeight="37.0" text="Button1" />
    <Button fx:id="button2" mnemonicParsing="false" prefHeight="37.0" text="Button2" />
  </children>
</HBox>
</children>
</AnchorPane>
<AnchorPane fx:id="view" prefHeight="244.0" prefWidth="568.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="binding.example2.ChildView2Controller">
 <children>
   <TableView fx:id="tableView" prefHeight="244.0" prefWidth="568.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
 </children>
</AnchorPane>
ChildView1Controller.java

package binding.example2;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Button;


public class ChildView1Controller {

@FXML private ResourceBundle resources;

@FXML private URL location;

@FXML private Button button1;

@FXML private Button button2;

@FXML private Node view;


@FXML
void initialize() {
    System.out.println("ChildView1Controller.initialize()");

    button1.setDisable(true);

}

 public Node getView()
 {
    return view;
 }

 public Button getButton1(){
    return button1; 
 }

}
package binding.example2;


import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;


public class ChildView2Controller {

@FXML private Node view;

@FXML private TableView<Person> tableView;

ObservableList<Person> data ;

public Node getView(){
    return view ;
   }

 @FXML
 void initialize() {
    System.out.println("ChildView2Controller.initialize()");

    //populateTable();
 }

public TableView<Person> getTableView(){
    return tableView ;
}   
 }
ChildView2Controller.java

package binding.example2;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Button;


public class ChildView1Controller {

@FXML private ResourceBundle resources;

@FXML private URL location;

@FXML private Button button1;

@FXML private Button button2;

@FXML private Node view;


@FXML
void initialize() {
    System.out.println("ChildView1Controller.initialize()");

    button1.setDisable(true);

}

 public Node getView()
 {
    return view;
 }

 public Button getButton1(){
    return button1; 
 }

}
package binding.example2;


import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;


public class ChildView2Controller {

@FXML private Node view;

@FXML private TableView<Person> tableView;

ObservableList<Person> data ;

public Node getView(){
    return view ;
   }

 @FXML
 void initialize() {
    System.out.println("ChildView2Controller.initialize()");

    //populateTable();
 }

public TableView<Person> getTableView(){
    return tableView ;
}   
 }
package binding.example2;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.fxml.fxml;
导入javafx.scene.Node;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入javafx.scene.control.cell.PropertyValueFactory;
公共类ChildView2控制器{
@FXML私有节点视图;
@FXML私有表视图表视图;
可观测数据;
公共节点getView(){
返回视图;
}
@FXML
void initialize(){
System.out.println(“ChildView2Controller.initialize()”;
//populateTable();
}
公共表视图getTableView(){
返回表视图;
}   
}
默认情况下,从ChildView1控制器禁用按钮1

我希望在选择其他视图(ChildView2.fxml)中的表行时启用它。当取消选择表格行时,再次禁用它。基本上,我希望绑定按钮和表,以便在选择表行时启用按钮。
请帮助我使用MainViewController代码绑定按钮和表行

您可以在
MainViewController
控制器上插入包含的fxml的控制器,如图所示

然后,您可以在
MainViewController
的初始化方法中执行所需的绑定。考虑到子控制器使用
getter
方法公开
按钮和
TableView
,因此
MainViewController
可以是:

public class MainViewController {
    @FXML
    private ChildView1Controller childView1Controller;
    @FXML
    private ChildView2Controller childView2Controller;

    @FXML
    public void initialize() {
        childView1Controller.getButton1().visibleProperty().bind(
            childView2Controller.getTableView().getSelectionModel().selectedItemProperty().isNotNull());
    }
}
要正确插入这些子控制器,需要更改MainView.fxml中的include元素,更新其
fx:id
属性:

<fx:include fx:id="childView1" source="ChildView1.fxml" />
<fx:include fx:id="childView2" source="ChildView2.fxml" />

@Dil的相关评论:


要求是,如果包含的资源的fx:id为“xxx”,则相应控制器的变量名为xxxController(因此详细信息->详细信息控制器)

您可以在
MainViewController
控制器上插入包含的fxml的控制器,如图所示

然后,您可以在
MainViewController
的初始化方法中执行所需的绑定。考虑到子控制器使用
getter
方法公开
按钮和
TableView
,因此
MainViewController
可以是:

public class MainViewController {
    @FXML
    private ChildView1Controller childView1Controller;
    @FXML
    private ChildView2Controller childView2Controller;

    @FXML
    public void initialize() {
        childView1Controller.getButton1().visibleProperty().bind(
            childView2Controller.getTableView().getSelectionModel().selectedItemProperty().isNotNull());
    }
}
要正确插入这些子控制器,需要更改MainView.fxml中的include元素,更新其
fx:id
属性:

<fx:include fx:id="childView1" source="ChildView1.fxml" />
<fx:include fx:id="childView2" source="ChildView2.fxml" />

@Dil的相关评论:


要求是,如果包含资源的fx:id为“xxx”,则相应控制器的变量名为xxxController(so details->details controller)

@Crferreira感谢您的输入。我还添加了控制器类。我不确定如何在MainViewConroller中插入childView控制器。我无法从MainViewController访问ChildView1控制器或ChildView2控制器。你能检查一下我的代码哪里出了问题吗?如果我试图访问ChildView1控制器,它会抛出异常。@Crferreira就是这样。它起作用了。我不知道这样一个事实:“要求是,如果包含资源的fx:id为“xxx”,则相应控制器的变量名为xxxController(so details->details controller)”@Crferreira感谢您的输入。我还添加了控制器类。我不确定如何在MainViewConroller中插入childView控制器。我无法从MainViewController访问ChildView1控制器或ChildView2控制器。你能检查一下我的代码哪里出了问题吗?如果我试图访问ChildView1控制器,它会抛出异常。@Crferreira就是这样。它起作用了。我不知道“要求是,如果包含的资源的fx:id为“xxx”,则相应控制器的变量名为xxxController(so details->details controller)”