FXMLLoader.load()永不退出(JavaFX 8)

时间:2014-06-13 17:01:45

标签: java javafx java-8 fxml

我正在尝试为我的应用程序加载主屏幕,实际上从未实际运行并显示屏幕。经过进一步调查(通过NetBeans调试器运行),我发现我的代码永远不会在FXMLLoader.load(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();
}

}

5 个答案:

答案 0 :(得分:4)

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

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

由于JavaFX 2.2,Initializable接口不再是加载FXML后初始化控制器的首选方法。这被改为使用@FXML注释。问题What is "automatic injection of location and resources properties into the controller" in JavaFX?显示了新方法的一个示例。

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

答案 1 :(得分:1)

这不是传统的JavafX代码。

您应该使用main和static启动方法来调用您的应用程序

示例:

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

并且启动调用start方法。

请查看http://docs.oracle.com/javafx/2/get_started/hello_world.htm以供参考。

答案 2 :(得分:0)

这不是传统的JavaFX代码。

您应该使用main和静态launch方法来调用您的应用程序

示例:

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

launch调用start方法。

请检查http://docs.oracle.com/javafx/2/get_started/hello_world.htm以创建

我不知道为什么你使用那种方法将主要内容附加到屏幕上

或者我不明白问题。

答案 3 :(得分:0)

我也见过这些问题。原因可能有所不同。我一直在编译命中列表以检查,尝试,注释掉等等。从TDD的角度来看,我建议添加单元测试来加载每个FXML文件,其中包含属性包和样式表。需要。测试还应该检查每个控制器注入的“ @FXML ”变量。

特别是你有一个无限循环,正如Aaron所说,因为:

  • primaryStage.show();

将致电:

  • initialize(URL url,ResourceBundle rb)

那时JavaFX运行时会非常困惑。我建议您使用Netbeans之一:“ JavaFX应用程序”模板(跟随)。 JavaFX运行时将调用start()方法。将launch()放在main()方法中。

Netbeans的:

  • 文件/
    • 新项目/
      • Maven ...(我的偏好
        • JavaFX应用程序
      • JavaFX ......
        • JavaFX应用程序

这些天我有一个名为Simple的简单项目“Maven :: JavaFX Application”项目。它只会加载给定的FXML文件。我用它来测试'已知'环境中的任何FXML问题。

在Start()方法调用LoadFXML(...)之后,将加载控制器并在看到控制器规范时调用initialize()方法:

  • FX:控制器 = “ graphics.MainScreenController

根据你问题中的代码,有些事情没说,你可以检查一下你是否还有其他问题:

  • 确保FXML文件名在网址中完全相同,区分大小写:“MainScreen.fxml”
  • FXML中的任何 fx:id =“componentName”分配都会在(代码隐藏)中注入“ @FXML ”注入)控制器。你可能也不会看到这个错误,只是抛出一个NullPointerException。这是最令人沮丧的错误之一,因为一切看起来都不错。
  • 反之亦然。如果你在(代码隐藏)控制器中注入' @FXML '但在FXML中没有相应的 fx:id ,那么事情就可以了也很困惑。
    • 在这个监视场景生成器上。在某些时候,它将我的fx:id =“myList”命名为fx:id =“myList1”,可能来自cut-n-paste。很难找到。

有些时候你只需要检查一切。您可以查看下面链接的“FXML diagnostic ...”问题列出的内容。

这个问题是间接递归。使用Netbeans JavaFX模板之一。我更喜欢Maven布局,因为它使用FXML,CSS等文件和测试文件夹构建了一个很好的结构。

在JavaFX代码中添加一些诊断:try / catch,logging,...我见过的大多数JavaFX示例都显示了闪亮的功能,而不太强调健壮性。此外,当使用FXML时,请注意即使在编译和发送Java代码之后,也可以通过NO重新编译来更改FXML,CSS和其他资源。

像JavaFX这样强大的工具有责任。 。

答案 4 :(得分:0)

陷入加载方法调用的可能性是抛出了被吞下的异常。

检查不同的异常,尤其是NullPointerException。