我有一个主场景,我保留所有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,但我尝试的任何东西都在工作:
有没有办法从不同的Stage(Class)访问这个字段?我通常使用Singleton设计模式,但我认为在这种情况下这是不可能的。我一直在寻找类似的问题,但我没有发现任何符合我问题的案例。谢谢你的帮助!
答案 0 :(得分:3)
不是将UI控件暴露给另一个类并直接修改它,更好的方法(并且可能更容易使用)将是使用中间类或一组类来保存您尝试的所有信息。 log,并使用属性绑定将数据绑定到事件日志文本区域。
这样,您可以维护类的边界,并将相关数据保存在适当的位置,并且您可以允许任何想要数据的人以标准方式访问它。
类似的东西:
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
课程中的日志信息属性,但这可以帮助您在保持信息分离的同时更进一步。