下面是在没有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应用程序?
您需要将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();
}
} );
}
你可以试试这个:
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并将其传递给我新编译和加载的应用程序子类?