当前位置: 首页 > 知识库问答 >
问题:

如何重新启动一个javafx应用程序?

邓丰
2023-03-14

下面是在没有fxml的情况下重新启动JavaFX应用程序的代码。

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class HelloFX extends Application
{
boolean state = true;

@Override
public void start( final Stage primaryStage )
{
    System.out.println( "state is " + state );
    playGame();
    System.out.println( "state is " + state );

    final Button restartButton = new Button( "Restart" );
    restartButton.setOnAction( __ ->
    {
        System.out.println( "Restarting app!" );
        primaryStage.close();
        Platform.runLater( () -> new HelloFX().start( new Stage() ) );
    } );
    primaryStage.setScene( new Scene( new StackPane( restartButton ) ) );
    primaryStage.show();
}

/**
 * Simulate a game play by changing the global state.
 */
private void playGame()
{
    state = false;
}

/**
 * @param args ignored.
 */
public static void main( final String[] args )
{
    launch( args );
}
}

但是,我想用fxml实现这一点。

我不知道如何使用fxml应用此代码。

我的代码。

Main.java

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception{
    Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
    primaryStage.setTitle("Hello World");
    primaryStage.setScene(new Scene(root, 300, 275));
    primaryStage.show();
}


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

控制器。JAVA

package sample;

public class Controller {

}

样品fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>


<GridPane alignment="center" hgap="10" vgap="10" xmlns:fx="http://javafx.com/fxml/1" 
xmlns="http://javafx.com/javafx/11.0.1" fx:controller="sample.Controller">
<children>
  <Button mnemonicParsing="false" onAction="#restart" text="restart" />
</children>
</GridPane>

我想重新启动我的JavaFX应用程序。

我不知道如何使用fxml应用此代码。

如何使用fxml重新启动JavaFX应用程序?

共有2个答案

荆运诚
2023-03-14

您需要将FXML中指定的事件处理程序与控制器类绑定,例如,向控制器添加restart函数,代码与之前的处理程序类似:

public void restart(Event e){
    System.out.println("restart clicked");

    Button button = (Button)e.getSource();
    Stage stage = (Stage) button.getScene().getWindow();

    Platform.runLater( () -> {
        try
        {
            stage.close();
            new Main().start( new Stage() );
        }
        catch (Exception e1)
        {
            // TODO:
            e1.printStackTrace();
        }
    } );
}
刘辰钊
2023-03-14

你可以试试这个:

public void restartApplication()
{
  final File currentFile = new File(TheCurrentClass.class.getProtectionDomain().getCodeSource().getLocation().toURI());

  /* is it a jar file? */
  if(!currentJar.getName().endsWith(".jar"))
    return;

  /* Build command: java -jar application.jar */
  final String command = "java -jar " + currentJar.getPath();

  final ProcessBuilder builder = new ProcessBuilder(command);
  builder.start();
  System.exit(0);
}

这基本上是通过java-jar命令重新启动程序

 类似资料:
  • 问题内容: 关于此事,我几乎遍历了每篇文章,但大多数都没有解释如何正确执行。问题: 我创建了一个javaFX应用程序,一个骰子游戏,人类玩家与计算机,但是在玩游戏的任何时候,人类玩家都应该能够单击“新游戏”按钮,并且应该从头开始重新启动游戏。 我尝试再次启动该阶段,但是在javafx中,我们不能两次调用launch方法。 1)有没有一种方法可以实现此功能而无需重新启动整个应用程序? 2)如果没有,

  • 问题内容: 如何重新启动Java AWT应用程序?我有一个附加了事件处理程序的按钮。我应该使用什么代码来重新启动应用程序? 我想做与应用程序中相同的事情。 问题答案: 当然,可以重新启动Java应用程序。 以下方法显示了一种重新启动Java应用程序的方法: 基本上,它执行以下操作: 查找Java可执行文件(我在这里使用了Java二进制文件,但这取决于您的要求) 查找应用程序(在我的情况下是一个ja

  • 问题内容: 我需要从另一个“容器”类启动一个Javafx应用程序,并在该应用程序上调用函数,但是似乎没有任何方法可以使用Application.launch()方法来获取对该应用程序的引用。这可能吗?谢谢 问题答案: 我遇到了同样的问题,并使用此hack解决了这个问题: 然后是您要从中启动应用程序的类: 希望对您有帮助。

  • 比方说我安装了OracleJDK11(只是为了让事情更简单)。然后我下载了Gluon的JavaFX11,并在JDK上解包。实际上,我在哪里解包JavaFX并不重要(因为我的下一个目标是基于OpenJRE制作我自己的JRE安装程序)。然后我尝试启动应用程序: 我得到了这个: 启动层初始化过程中发生错误java.lang.LayerInstantiation异常:包jdk.internal.jrtfs

  • 问题内容: 我正在尝试从JavaFx应用程序内部启动JavaFx应用程序,但是看起来Application.launch()只能被调用一次。这是否意味着我必须像exec(“ java …”中那样启动一个单独的JVM …还是还有另一种方法? 更多背景信息。我希望我的JavaFx应用程序能够构建和运行JavaFx应用程序。现在,它可以在内存中编译类,装入类…真的很不​​幸,不得不诉诸一切将文件写入文件

  • 我试图从JavaFx应用程序中启动JavaFx应用程序,但看起来application.launch()只能调用一次。这是否意味着我必须启动一个单独的JVM...就像在exec(“java.......或者还有其他方法吗? 作为次要问题...是否有方法打开另一个JavaFx窗口,获取stage并将其传递给我新编译和加载的应用程序子类?