我正在尝试为我的应用程序加载主屏幕,实际上从未实际运行并显示屏幕。经过进一步调查(通过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();
}
}
答案 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所说,因为:
将致电:
那时JavaFX运行时会非常困惑。我建议您使用Netbeans之一:“ JavaFX应用程序”模板(跟随)。 JavaFX运行时将调用start()方法。将launch()放在main()方法中。
Netbeans的:
这些天我有一个名为Simple的简单项目“Maven :: JavaFX Application”项目。它只会加载给定的FXML文件。我用它来测试'已知'环境中的任何FXML问题。
在Start()方法调用LoadFXML(...)之后,将加载控制器并在看到控制器规范时调用initialize()方法:
根据你问题中的代码,有些事情没说,你可以检查一下你是否还有其他问题:
有些时候你只需要检查一切。您可以查看下面链接的“FXML diagnostic ...”问题列出的内容。
这个问题是间接递归。使用Netbeans JavaFX模板之一。我更喜欢Maven布局,因为它使用FXML,CSS等文件和测试文件夹构建了一个很好的结构。
在JavaFX代码中添加一些诊断:try / catch,logging,...我见过的大多数JavaFX示例都显示了闪亮的功能,而不太强调健壮性。此外,当使用FXML时,请注意即使在编译和发送Java代码之后,也可以通过NO重新编译来更改FXML,CSS和其他资源。
像JavaFX这样强大的工具有责任。 。
答案 4 :(得分:0)
陷入加载方法调用的可能性是抛出了被吞下的异常。
检查不同的异常,尤其是NullPointerException。