gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:27:21 25 4
gpt4 key购买 nike

我有一个主要场景,其中保存了所有 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)静态(在运行时抛出异常)

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

最佳答案

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

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

类似于:

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 绑定(bind)到日志数据,如下所示:

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 类中的日志信息属性,但这应该可以帮助您取得进一步的进展,同时仍保持信息分离。

关于JavaFX如何从其他Stage(类)访问字段(TextArea),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28509778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com