JavaFX窗口设置标题

6

我有一个主类,内容如下:

public class Window extends Application {


    @Override
    public void start(Stage foablak) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("Foablak.fxml"));
        Scene scene = new Scene(root);

        foablak.setScene(scene);
        foablak.setWidth(900);
        foablak.setHeight(700);
        foablak.setResizable(false);
        foablak.setTitle("Window");

        foablak.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

如何在不关闭窗口并打开新窗口的情况下,从另一个.java类中更新标题?

3个回答

8

仅为了暴露属性而使用static可能被认为是一种不良设计。有不同的方法可以实现相同的效果,例如从Window类中公开一个设置舞台标题的方法。

public class Window extends Application {

    private Stage stage;

    @Override
    public void start(Stage foablak) throws Exception {
        stage = foablak;
        Parent root = FXMLLoader.load(getClass().getResource("Foablak.fxml"));
        Scene scene = new Scene(root);

        foablak.setScene(scene);
        foablak.setWidth(900);
        foablak.setHeight(700);
        foablak.setResizable(false);
        foablak.setTitle("Window");

        foablak.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    public void setStageTitle(String newTitle) {
        stage.setTitle(newTitle);
    }
}

3

是的,你可以。在你的Application.start()方法中,保存一个对主Stage的引用,以便在其他地方访问,然后调用Stage.setTitle()

class MyApplication extends Application {

    public static Stage primaryStage;

    @Override
    public void start(Stage primaryStage) {
        MyApplication.primaryStage = primaryStage;

        // ...
    }

}

MyApplication.primaryStage.setTitle("New Title");

另外,我建议不要将你的类命名为Window,因为这是JavaFX类之一的名称。


1
以下可能不是你在寻找的解决方案,但对于一些开发者可能会有用:
  • 场景:只有一个JavaFX应用程序;需要多次运行该应用程序;您想区分谁在运行该应用程序
  • 注意:注意Main和Controller类的运行顺序
  • 解决方案:i. 在Controller类中声明一个私有静态变量,例如private static String strWho; ii. 通过提供getter方法来公开strWho。例如:public static String getWho(){ return strWho; }; iii. 为Controller实现initialize方法,并根据您的需要每次运行JavaFX应用程序时分配一个不同的值。例如:@FXML public void initialize() { strWho = "你需要在这里编写逻辑,以便每次运行应用程序时都有一个不同的值"; }
  • 在Main start方法中,在调用stage.show之前设置标题。例如: primaryStage.setTitle(Controller.getWho())); primaryStage.show();
  • 实现strWho每次运行应用程序时具有不同值的逻辑的一种方法:可以在Controller的initialize方法中使用TextInputDialog接受用户输入,询问名称等。

请不要使用静态作用域,因为在大多数情况下你并不需要它(尤其是在 OP 的上下文中)。 - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接