我正在使用计算器,我希望在侧面打开一个日志阶段,现在我的问题是我需要更新舞台,我想最简单的方法就是检查舞台是否正在显示,以及如果它然后隐藏它,那似乎没有工作,这是我的代码:
public void start(Stage logStage) {
boolean open = logStage.isShowing();
System.out.println(open);
if(open == true){
logStage.hide();
System.out.println("Should be hidden now!");
}
logStage.setTitle("Log");
GridPane grid = new GridPane();
grid.setAlignment(Pos.TOP_CENTER);
grid.setHgap(5);
grid.setVgap(5);
TextArea logText = new TextArea();
for (String log : Logger.fraLog()) {
logText.setText(logText.getText() + log);
}
grid.add(logText, 0, 0, 10, 10);
Scene scene = new Scene(grid);
logStage.setHeight(210);
logStage.setWidth(300);
logStage.setX(1135);
logStage.setY(350);
logStage.setScene(scene);
logStage.setResizable(false);
logStage.setAlwaysOnTop(true);
logStage.show();
}
运行此方法3次后,我的输出为:
false
false
false
我称之为方法的方式是:
Logger logger = new Logger();
logger.start(new Stage());
感谢任何帮助
答案 0 :(得分:1)
隐藏新的Stage
,直到您显示它为止。由于您每次都在创建新的Stage
,因此当您阅读showing
属性时,不会显示任何内容。
此外,由于您无论如何都要为show()
调用Stage
,因此撤消了hide()
来电的任何影响。
您可能应该重复使用相同的Stage
/场景图。此外,由于您再次显示该窗口,因此不清楚您对hide()
电话的期望效果如何;简单地替换内容而不隐藏Stage
会产生同样的效果。
答案 1 :(得分:0)
如果您需要从另一个类更新TextArea,则传递对它的引用,例如在另一个类的构造函数中。这可能看起来像:
a)你上课:
public class MyClass {
private TextArea textarea;
public MyClass(TextArea t){
this.textarea = t;
}
public void someMethodThatNeedsToLog(){
this.textarea.appendText("the next log message ...");
}
}
b)您的初始化代码:
public void start(Stage logStage) {
// ...
TextArea logText = new TextArea();
MyClass instance = new MyClass(logText);
// ...
logStage.show();
希望有帮助...
BTW:这不是JavaFX或UI编程的问题。您可能希望了解面向对象编程的原理,例如"控制反转","依赖注入/构造函数注入"。