JavaFX如何从其他阶段(类)访问字段(TextArea)

JavaFX如何从其他阶段(类)访问字段(TextArea),java,javafx,Java,Javafx,我有一个主要的场景,在那里我保留了所有的木龟。它有一个菜单,可以打开新的场景,其中我有一些设置: public class StartController implements Initializable { // Some other fields @FXML private TextArea eventLog; // This method opens "new project" window @FXML private void openProjectWin

我有一个主要的场景,在那里我保留了所有的木龟。它有一个菜单,可以打开新的场景,其中我有一些设置:

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文本区域是我放置所有日志的地方,如应用程序启动、设置更改、项目保存等。我正在使用openProjectWindow void打开新场景,并将此信息添加到我的记录器中。我的新窗口是一个单独的类:

public class ProjectWindowController implements Initializable {

// fields and methodes to fill and save forms

}
完成后,我需要以某种方式访问StartController.eventLog,但我尝试的一切都不起作用:

  • 将事件日志更改为公共日志
  • 通过ProjectWindowController扩展StartController并尝试super.eventLog.appendText()
  • 将eventLog更改为公共静态(在运行时引发异常)

是否有任何方法可以从不同的阶段(类)访问此字段?我通常会使用单例设计模式,但我认为在这种情况下是不可能的。我在寻找类似的问题,但我没有发现任何与我的问题相匹配的案例。谢谢你的帮助

与其将UI控件公开给另一个类并直接修改它,更好的方法(可能更容易使用)是使用一个中间类或一组类来保存您试图记录的所有信息,并使用属性绑定将数据绑定到事件日志文本区域

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

比如:

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
类中的log info属性,但这将有助于您在保持信息分离的同时取得更大的进步。

与其将UI控件公开给另一个类并直接修改它,不如采用更好的方法(而且可能更易于使用)将使用一个中间类或一组类来保存您试图记录的所有信息,并使用属性绑定将数据绑定到事件日志文本区域

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

比如:

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
类中的log info属性,但这将有助于您在保持信息分离的同时取得更大的进步。

与其将UI控件公开给另一个类并直接修改它,不如采用更好的方法(而且可能更易于使用)将使用一个中间类或一组类来保存您试图记录的所有信息,并使用属性绑定将数据绑定到事件日志文本区域

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

比如:

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
类中的log info属性,但这将有助于您在保持信息分离的同时取得更大的进步。

与其将UI控件公开给另一个类并直接修改它,不如采用更好的方法(而且可能更易于使用)将使用一个中间类或一组类来保存您试图记录的所有信息,并使用属性绑定将数据绑定到事件日志文本区域

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

比如:

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
类中的log info属性,但这将有助于您在保持信息分离的同时获得更进一步的信息。

谢谢,但是有没有办法不公开它并从其他类访问它,就像普通的二传手一样?@RichardK我不确定我是否完全理解这个问题,但看看我最近的编辑。您仍然可以像通常一样在
LogInfo
类中隐藏相关的属性/方法,并使用公共访问器从其他类中获取和设置数据。这只是提供了一种让两个类都访问共享数据的方法,而不必将一个类中的对象不必要地公开给另一个类。希望这能帮上忙。非常感谢,这就是我要找的:)@RichardK很乐意帮忙。如果我的答案解决了您的问题,请不要忘记将其标记为已接受。谢谢,但是有没有办法不公开它并从其他类访问它,就像普通的setter一样?@RichardK我不确定我是否完全理解这个问题,但请看我最近的编辑。您仍然可以像通常一样在
LogInfo
类中隐藏相关的属性/方法,并使用公共访问器从其他类中获取和设置数据。这只是提供了一种让两个类都访问共享数据的方法,而不必将一个类中的对象不必要地公开给另一个类。希望这能帮上忙。非常感谢,这就是我要找的:)@RichardK很乐意帮忙。如果我的答案解决了您的问题,请不要忘记将其标记为已接受。谢谢,但是有没有办法不公开它并从其他类访问它,就像普通的setter一样?@RichardK我不确定我是否完全理解这个问题,但请看我最近的编辑。您仍然可以在
LogInfo
类中像y一样隐藏相关的属性/方法