我正在尝试为我的应用程序加载主屏幕,实际上它从未实际运行并显示屏幕。经过进一步调查(通过 NetBeans 调试器运行它),我发现我的代码在 FXMLLoader.load(url); 之后永远不会执行; -- 它停在那里,并且不会抛出任何错误。我确实知道 url 是正确的 - 我检查了它的值,它是正确的。谁知道怎么修它?提前致谢!

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

<?import java.lang.*?>
<?import javafx.scene.text.*?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-      Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8"    xmlns:fx="http://javafx.com/fxml/1" fx:controller="graphics.MainScreenController">
<children>
<Text fx:id="funds" layoutX="489.0" layoutY="383.0" strokeType="OUTSIDE" strokeWidth="0.0" text="USD 52,356,000.07">
</Text>
</children></AnchorPane>
package graphics;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.MenuButton;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;

/**
 * FXML Controller class
 *
 */
 public class MainScreenController extends Application implements Initializable {


@FXML
private Text funds;

/**
 * Initializes the controller class.
 */
public void initialize(URL url, ResourceBundle rb) {
    start(new Stage());

}

@Override
public void start(Stage primaryStage){
    Parent root = null;
    try {
        URL url = getClass().getResource("MainScreen.fxml");
        root = FXMLLoader.load(url);
    } catch (Exception ex) {
        Logger.getLogger(MainScreenController.class.getName()).log(Level.SEVERE, null, ex);
    }
    Scene scene = new Scene(root,1200,800);
    primaryStage.setTitle("Title");
    primaryStage.setScene(scene);
    primaryStage.show();
}

}

最佳答案

您已经使用 initialize() 方法创建了一个无限循环。 FXMLLoader 会自动调用 initialize 方法。

您正在从 initialize() 方法调用 start(),该方法加载 MainScreen.fxml 文件,该文件创建一个新的 MainScreenController 实例。 FXMLLoader 会自动在新实例上调用 initialize(),而新实例又会调用 start(),它会再次加载 MainScreen.xml,以此类推。

从 JavaFX 2.2 开始,Initializable 接口(interface)不再是加载 FXML 后初始化 Controller 的首选方式。这已更改为使用@FXML 批注。问题 What is "automatic injection of location and resources properties into the controller" in JavaFX? 显示了新方法的示例。

另外,我不确定您为什么要在 initialize() 方法中创建一个新的 Stage()。通常要获得舞台,您需要在应用程序上调用 launch() 并且 start() 方法将自动与舞台一起为您调用。一个例子在这里:http://docs.oracle.com/javafx/2/get_started/hello_world.htm

关于java - FXMLLoader.load() 从不退出 (JavaFX 8),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24210420/

10-09 04:03