繁体   English   中英

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

[英]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打开新场景,并将此信息添加到记录器中。 我的新窗口是一个单独的类:

public class ProjectWindowController implements Initializable {

// fields and methodes to fill and save forms

}

完成后,我需要以某种方式访问​​StartController.eventLog,但是我尝试过的一切都没有用:

  • 将eventLog更改为公开
  • 通过ProjectWindowController扩展StartController并尝试使用super.eventLog.appendText()
  • 将eventLog更改为public static(在运行时引发异常)

有什么方法可以从不同的阶段(类)访问此字段? 我通常使用Singleton设计模式,但我认为在这种情况下是不可能的。 我在寻找类似的问题,但没有找到与我的问题相符的案例。 谢谢你的帮助!

与将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());

        // ...
    }
}

您可以在LogInfo类中选择UI更新日志信息属性的方式,但这将有助于您在保持信息分离的同时走得更远。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM