JavaFX 如何从其他舞台访问字段 (TextArea) (Class)

JavaFX how to access field (TextArea) from other Stage (Class)

我有一个主场景,我保留了所有 mu GUI。它有一个菜单,可以打开新场景,我在其中进行了一些设置:

public class StartController implements Initializable {

// Some other fields

    @FXML
    private TextArea eventLog;

// This method opens "new project" window

@FXML
    private void openProjectWindow(Event event) throws IOException {

        eventLog.appendText(EventLogUtils.getDate() + STATUS.INFO
                + " New project window opened\n");

        GridPane newProjectWindow = (GridPane) FXMLLoader.load(getClass()
                .getResource("../view/project.fxml"));
        Scene scene = new Scene(newProjectWindow, 800, 600);
        scene.getStylesheets().add(
                getClass().getResource("../view/main.css").toExternalForm());
        Stage projectStage = new Stage();
        projectStage.setScene(scene);
        projectStage.setTitle("New Project");
        projectStage.show();
    } 

}

这个 eventLog TextArea 是我放置所有日志的地方,例如应用程序启动、设置更改、项目保存等。我正在使用 openProjectWindow void 打开新场景,并将此信息添加到我的记录器中。我的新 window 是一个单独的 class:

public class ProjectWindowController implements Initializable {

// fields and methodes to fill and save forms

}

完成后,我需要以某种方式访问​​ StartController.eventLog,但我尝试的任何操作均无效:

有什么方法可以从不同的 Stage (Class) 访问该字段吗?我通常会使用 Singleton 设计模式,但我认为在这种情况下这是不可能的。我一直在寻找类似的问题,但没有找到与我的问题相匹配的案例。感谢您的帮助!

与其将 UI 控件暴露给另一个 class 并直接修改它,更好的方法(并且可能更易于使用)是使用中间 class 或设置classes 来保存您尝试记录的所有信息,并使用 属性 绑定将数据绑定到事件日志文本区域。

这样,您可以维护 classes 的边界,并将相关数据组织在适当的位置,并且您可以允许任何需要数据的人以标准方式访问它。

类似于:

public final class LogInfo {
    private static StringProperty logData = new SimpleStringProperty();
    // methods that set/format logData based on changes from your UI

    // provide public access to the property
    public static StringProperty logDataProperty() { return logData; }
    public static void setLogData(String data) { logData.set(data); }
    public static String getLogData() { return logData.get(); }
}

然后在你的UI场景中,你可以像这样将UI控件的textProperty绑定到日志数据:

public class StartController implements Initializable {

// Some other fields

    @FXML
    private TextArea eventLog;

    @FXML
    public void initialize(URL url, ResourceBundle resourceBundle ) {
        // other initialize stuff

        // bind the log property to this event log
        // Bindings.bindBidirectional() if you want to be able to control the property from both sides.
        eventLog.textProperty().bind(LogInfo.logDataProperty());

        // ...
    }
}

您可以选择 UI 如何更新您的 LogInfo class 中的日志信息 属性,但这应该可以帮助您取得更多进展,同时仍然保持信息分离。