JavaFX隐藏表单然后立即再次显示

时间:2016-11-01 15:48:30

标签: java javafx java-8 javafx-8

我正在使用计算器,我希望在侧面打开一个日志阶段,现在我的问题是我需要更新舞台,我想最简单的方法就是检查舞台是否正在显示,以及如果它然后隐藏它,那似乎没有工作,这是我的代码:

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

感谢任何帮助

2 个答案:

答案 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编程的问题。您可能希望了解面向对象编程的原理,例如"控制反转","依赖注入/构造函数注入"。

相关问题