多FXML与控制器,共享对象(Multiple FXML with Controllers, sha

2019-06-17 21:44发布

Goodevening大家,

我发现了一堆帖子已经对这个话题,但我仍然不能设法从控制器1传递一个对象到控制器2。 有没有什么地方一个完整的教程或做一些这方面的例子项目?

到目前为止,我已经得到了这一点,直到我卡住了:

国家类

public class Country {
private SimpleStringProperty country = new SimpleStringProperty("");

//Constructor
public Country() {
}

//GETTERS
public String getCountry() {
    return country.get();
}

//SETTERS
public void setCountry(String value) {
    country.set(value);
}

@Override
public String toString() {
    return getCountry();
}
}

当程序启动时,主要FXML被加载(Sample.fxml)。 这包含在顶部面板中的菜单栏,并在中心的内容窗格边框窗格。 在初始化我创建了一个新的国家目标,并将其存储在一个全局变量。 我单击菜单项时加载另一个FXML到内容窗格的方法:

SampleController.java

public class SampleController implements Initializable {

@FXML
private Pane pContent;

private Country c;

@FXML
private void handleButtonAction(ActionEvent event) throws IOException {
    System.out.println(c); //this prints Belgium, which is correct

    URL url = getClass().getResource("Sub1.fxml");

    FXMLLoader fxmlloader = new FXMLLoader();
    fxmlloader.setLocation(url);
    fxmlloader.setBuilderFactory(new JavaFXBuilderFactory());

    pContent.getChildren().clear();
    pContent.getChildren().add((Node) fxmlloader.load(url.openStream()));
}

@Override
public void initialize(URL url, ResourceBundle rb) {
    c = new Country();
    c.setCountry("Belgium");
}

public Country getCountryFromSampleController(){
    return c;
}
}

现在,我要拍摄的对象国时Sub1.fxml被加载,这意味着我需要获取关于初始化对象国():

Sub1Controller.java

public class Sub1Controller implements Initializable {

/**
 * Initializes the controller class.
 */
@Override
public void initialize(URL url, ResourceBundle rb) {
    SampleController sp = new SampleController(); //I don't know how to fetch the original SampleController object
    System.out.println(sp.getCountryFromSampleController()); 
    //this prints null, which is ofcourse logical because I make a new SampleController object.         
}    
}

这个问题我有,我怎么能得到的“原始” SampleController对象,这样我就可以使用getCountryFromRoot()方法来获取与价值比利时国家目标? 我一直在寻找在这个问题上几个小时,看了StackOverflow上这个每一个岗位,但似乎我并没有发现丢失的链接...任何帮助(最好用这个代码)表示赞赏!

很抱歉的长期职位,我试图将尽可能完整否则我永远不会明白...

Answer 1:

FXML是一种简单形式的MVC模式 。 FXML文件是一个视图,控制器是显而易见的,什么是错过了什么? 该模型 - 在这里你的所有相关数据存储到当前视图,因此一个地方,你可以使用控制器之间共享国家数据。


1.一个可能的办法引进模式是“上下文”。 让我们考虑的情况下,那么你必须为整个项目只有一种模式,所以你可以在形式全球范围内辛格尔顿

public class Context {
    private final static Context instance = new Context();

    public static Context getInstance() {
        return instance;
    }

    private Country country = new Country();

    public Country currentCountry() {
        return country;
    }
}

你SampleController将有未来的变化:

@Override
public void initialize(URL url, ResourceBundle rb) {
    Context.getInstance().currentCountry().setCountry("Belgium");
}

SubController1可以访问它以同样的方式:

@Override
public void initialize(URL url, ResourceBundle rb) {
    System.out.println(Context.getInstance().currentCountry().getCountry());
}

2.另一种方式是通过上下文SubController1那么你加载的XML。 这将更好地工作,如果你不希望有应用全球模式。 因此,创建类似Context类,但没有实例字段,并且:

public class Sub1Controller implements Initializable {
    private Context context;
    public void setContext(Context context) {
        this.context = context;
        // initialize country dependent data here rather then in initialize()
    }
}

在设置方面SampleController

Context currentContext = new Context();

@Override
public void initialize(URL url, ResourceBundle rb) {
    currentContext.currentCountry().setCountry("Belgium");
}

@FXML
private void handleButtonAction(ActionEvent event) throws IOException {
    URL url = getClass().getResource("Sub1.fxml");

    FXMLLoader fxmlloader = new FXMLLoader();
    fxmlloader.setLocation(url);
    fxmlloader.setBuilderFactory(new JavaFXBuilderFactory());

    pContent.getChildren().clear();
    pContent.getChildren().add((Node) fxmlloader.load(url.openStream()));
            // here we go
    ((Sub1Controller)fxmlloader.getController()).setContext(currentContext);
}


Answer 2:

通过使用DataFX的流API,您可以通过使用CDI注入在你的控制器实例的数据:

  • http://www.guigarage.com/2014/03/datafx-8-nighthacking/
  • http://www.guigarage.com/2013/12/datafx-controller-framework-preview/
  • http://www.javafxdata.org


文章来源: Multiple FXML with Controllers, share object