【问题标题】:JavaFX hide form then show again instantlyJavaFX 隐藏表单然后立即再次显示
【发布时间】:2016-11-01 15:48:30
【问题描述】:

我正在使用计算器,我想在侧面打开一个日志阶段,现在我的问题是我需要更新阶段,我认为最简单的方法是检查阶段是否正在显示,并且如果是然后隐藏它,那似乎不起作用,这是我的代码:

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

感谢任何帮助

【问题讨论】:

  • 在计算器右上角创建一个小切换按钮,按下该按钮可打开日志。使用工具提示来解释按钮是什么。例如:“打开日志”、“关闭日志”。在这里查看我的 javafx 计算器。 github.com/sedj601/CalculatorFx
  • 创建新窗口的不是对show()的调用;这是对new Stage() 的调用。对show() 的调用只是使窗口出现在屏幕上:如果它已经显示,则没有效果。
  • 无论记录器窗口是否可见,为什么不只更新文本字段?
  • 问题是我不知道如何“只是”从另一个类更新文本区域

标签: java javafx java-8 javafx-8


【解决方案1】:

一个新的Stage 在您显示之前被隐藏。由于您每次都在创建新的Stages,因此当您读取showing 属性时,它们都不会显示。

此外,由于您为Stage 调用了show(),因此您撤消了hide() 调用的任何效果。

也许您应该重用相同的Stage/scene 图。此外,由于您再次显示窗口,因此不清楚您对hide() 调用的期望是什么;简单地替换内容而不隐藏Stage 将具有相同的效果。

【讨论】:

    【解决方案2】:

    如果您需要从另一个类更新 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();
    

    希望对您有所帮助...

    顺便说一句:这与 JavaFX 或 UI 编程无关。您可能想了解面向对象编程的原理,例如“控制反转”、“依赖注入/构造函数注入”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 2017-12-13
      • 2012-12-02
      • 1970-01-01
      相关资源
      最近更新 更多