在JavaFX中,在窗口之间传递信息的最佳方式是什么?

在JavaFX中,在窗口之间传递信息的最佳方式是什么?,java,javafx,java-8,javafx-8,fxml,Java,Javafx,Java 8,Javafx 8,Fxml,我正在使用下面的代码传递信息,但我想知道其他方法。在FXMLDocumentController的事件处理程序方法handleSubmitButtonAction中,我创建了另一个加载MainFXML文件的窗口。之后,我得到了它的控制器,并将我的信息发送到主窗口。有更好的方法吗 public class FXMLDocumentController implements Initializable { @FXML private TextField user; @FX

我正在使用下面的代码传递信息,但我想知道其他方法。在FXMLDocumentController的事件处理程序方法handleSubmitButtonAction中,我创建了另一个加载MainFXML文件的窗口。之后,我得到了它的控制器,并将我的信息发送到主窗口。有更好的方法吗

public class FXMLDocumentController implements Initializable {

    @FXML
    private TextField user;

    @FXML
    public void handleSubmitButtonAction(ActionEvent event) throws IOException {
        Alert dialogo = new Alert(Alert.AlertType.INFORMATION, "User: " + user.getText() + " logged in.");
        dialogo.showAndWait();
        Stage stage2 = (Stage) user.getScene().getWindow();
        stage2.close();

        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MainFXML.fxml"));        
        Parent root = (Parent) fxmlLoader.load();
        MainFXMLController controller = fxmlLoader.<MainFXMLController>getController();        

        Scene scene = new Scene(root);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.show();

        controller.setUser(user.getText());        
    }
公共类FXMLDocumentController实现可初始化{
@FXML
私有文本字段用户;
@FXML
public void handleSubmitButtonAction(ActionEvent事件)引发IOException{
Alert dialogo=new Alert(Alert.AlertType.INFORMATION,“用户:”+User.getText()+“登录”);
dialogo.showAndWait();
Stage stage2=(Stage)user.getScene().getWindow();
阶段2.关闭();
FXMLLoader FXMLLoader=新的FXMLLoader(getClass().getResource(“MainFXML.fxml”);
父根=(父)fxmlLoader.load();
MainFXMLController=fxmlLoader.getController();
场景=新场景(根);
阶段=新阶段();
舞台场景;
stage.show();
controller.setUser(user.getText());
}

试图给出一个简短的答案

我所做的是创建控制器类的“应用程序模型”。应用程序模型的根当然是应用程序类的控制器。应用程序模型不会泄漏GUI元素,而是告诉主程序可关闭、已更改等

public abstract class Part {
       public final ObservableMap<String, ActionHandler> getActionHandlers() {...}    
       public final ObservableBooleanValue closableProperty() {...}
       public final ReadOnlyBooleanProperty disabledProperty() {...}
       ....
}

public abstract class ViewPart extends Part {
       public final StringProperty titleProperty() { ... }
       public final ReadOnlyObjectProperty<Image> iconProperty() { ... }
       ....
}

public abstract class Editor extends Part {
        public final ObservableBooleanValue dirtyProperty() { .... }
}
公共抽象类部分{
公共最终观察映射getActionHandlers(){…}
公共最终ObservableBoleanValue closableProperty(){…}
公共最终ReadOnlyBooleanProperty disabledProperty(){…}
....
}
公共抽象类ViewPart扩展部分{
公共最终StringProperty titleProperty(){…}
公共最终只读对象属性iconProperty(){…}
....
}
公共抽象类编辑器扩展部分{
公共最终可观察到的BoleAnValue目录属性()
}

像在Eclipse中一样,这些部分可以有自己的窗口,但不一定有,它们也可以嵌入到另一个窗口中。这种建模松散地基于Eclipse的结构。

将应用程序用作单实例“控制器”在MVC的意义上?不漂亮,但在FX控制器类之间解耦。我想知道哪一种是最好的方法。每个javafx应用程序都是MVC,因为fxml文件,对吗?最好的方法只是一种意见。每个人都可以有不同的意见。因此,你可以根据不同的意见得到许多不同的答案,你会无论如何,在我看来,如果是大型应用程序,请使用依赖项注入机制,例如,将注入的对象JavaFX Bean设置为可观察属性,并绑定UI项或侦听属性的更改。但是,另一方面,您在问题中提出的解决方案可能最适合您你,你自己决定。也许是复制品:。