java 在 main 中加载 fxml 文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33683302/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 21:59:44  来源:igfitidea点击:

Loading fxml file in main

javajavafxfxmlscenebuilder

提问by R.co

i did this tutorial from youtube, and i have the same code than the tutorial but i did my proper fxml with Scenebuilder. Here is the code: https://github.com/AlmasB/FXTutorials/tree/master/src/com/almasb/calcI have the same Main, same Controller and same Model.. When i try to compile it says to me :

我从 youtube 上做了这个教程,我的代码与教程相同,但我用 Scenebuilder 做了我正确的 fxml。这是代码:https: //github.com/AlmasB/FXTutorials/tree/master/src/com/almasb/calc我有相同的主、相同的控制器和相同的模型..当我尝试编译它对我说:

`Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication7(Unknown Source)
    at com.sun.javafx.application.LauncherImpl$$Lambda/1394438858.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.load(Unknown Source)
    at application.Main.start(Main.java:12)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication13(Unknown Source)
    at com.sun.javafx.application.LauncherImpl$$Lambda/1252716230.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait6(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda/1775282465.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null4(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda/21202996.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater5(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda/2040495657.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null1(Unknown Source)
    at com.sun.glass.ui.win.WinApplication$$Lambda/1558600329.run(Unknown Source)
    ... 1 more
Exception running application application.Main

package application;

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

This is my main :

这是我的主要内容:

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

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
       try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("view/Calculatorview.fxml"));
  //    Parent root = FXMLLoader.load(getClass().getResource("view/Calculatorview.fxml"));
        AnchorPane root = (AnchorPane) loader.load();
        Scene scene = new Scene(root);

        primaryStage.setScene(scene);
        primaryStage.show();
    } 
       catch(Exception e)    {
        e.printStackTrace();
    }
    }
    public static void main(String[] args) {
      launch(args);
    }
}

This is my fxml file :

这是我的 fxml 文件:

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

<?import javafx.embed.swing.*?>
<?import javafx.scene.effect.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<fx:root maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="640.0" type="AnchorPane" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller">
   <children>
      <AnchorPane prefHeight="600.0" prefWidth="700.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <SplitPane dividerPositions="0.19063545150501673" layoutX="149.0" layoutY="32.0" orientation="VERTICAL" prefHeight="600.0" prefWidth="500.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
              <items>
                <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
                     <children>
                        <TextField alignment="CENTER_RIGHT" prefHeight="73.0" prefWidth="638.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                           <font>
                              <Font size="47.0" />
                           </font>
                        </TextField>
                     </children>
                  </AnchorPane>
                <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="515.0" prefWidth="498.0">
                     <children>
                        <GridPane layoutX="90.0" layoutY="116.0" prefHeight="319.0" prefWidth="638.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                          <columnConstraints>
                              <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                              <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                              <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                              <ColumnConstraints hgrow="SOMETIMES" maxWidth="116.0" minWidth="10.0" prefWidth="95.0" />
                              <ColumnConstraints hgrow="SOMETIMES" maxWidth="116.0" minWidth="10.0" prefWidth="95.0" />
                              <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                              <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                          </columnConstraints>
                          <rowConstraints>
                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                          </rowConstraints>
                           <effect>
                              <Blend />
                           </effect>
                           <children>
                              <Button mnemonicParsing="false" onAction="#processOperator" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #EE543A; -fx-text-fill: #FFFFFF;" text="=" GridPane.columnIndex="7" GridPane.rowIndex="4">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="620.0" layoutY="395.0" mnemonicParsing="false" onAction="#processOperator" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #EE543A; -fx-text-fill: #FFFFFF;" text="+" GridPane.columnIndex="7" GridPane.rowIndex="3">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="620.0" layoutY="299.0" mnemonicParsing="false" onAction="#processOperator" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #EE543A; -fx-text-fill: #FFFFFF;" text="-" GridPane.columnIndex="7" GridPane.rowIndex="2">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="620.0" layoutY="203.0" mnemonicParsing="false" onAction="#processOperator" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #EE543A; -fx-text-fill: #FFFFFF;" text="×" GridPane.columnIndex="7" GridPane.rowIndex="1">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="620.0" layoutY="107.0" mnemonicParsing="false" onAction="#processOperator" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #EE543A; -fx-text-fill: #FFFFFF;" text="÷" GridPane.columnIndex="7">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="532.0" layoutY="395.0" mnemonicParsing="false" prefHeight="70.0" prefWidth="76.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="C" GridPane.columnIndex="4" GridPane.rowIndex="4">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="358.0" layoutY="395.0" mnemonicParsing="false" onAction="#processNumpad" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #9E9D9B; -fx-text-fill: #FFFFFF;" text="0" GridPane.columnIndex="5" GridPane.rowIndex="4">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="362.0" layoutY="395.0" mnemonicParsing="false" prefHeight="69.0" prefWidth="88.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="M-" GridPane.columnIndex="4">
                                 <font>
                                    <Font size="28.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="e" GridPane.columnIndex="1" GridPane.rowIndex="4">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="1/x" GridPane.columnIndex="3" GridPane.rowIndex="4">
                                 <font>
                                    <Font name="System" size="28.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="√" GridPane.columnIndex="3" GridPane.rowIndex="3">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="MC" GridPane.columnIndex="3" GridPane.rowIndex="2">
                                 <font>
                                    <Font name="System" size="28.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="M+" GridPane.columnIndex="3" GridPane.rowIndex="1">
                                 <font>
                                    <Font size="27.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="x2" GridPane.columnIndex="2" GridPane.rowIndex="3">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="tan" GridPane.columnIndex="2" GridPane.rowIndex="2">
                                 <font>
                                    <Font name="System" size="28.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="sin" GridPane.columnIndex="2" GridPane.rowIndex="1">
                                 <font>
                                    <Font name="System" size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="x?" GridPane.rowIndex="4">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="log" GridPane.rowIndex="2">
                                 <font>
                                    <Font name="System" size="28.0" />
                                 </font>
                              </Button>
                              <Button graphicTextGap="0.0" layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="cos" GridPane.columnIndex="2">
                                 <font>
                                    <Font name="System" size="26.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text=")">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button alignment="CENTER" layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="x3" GridPane.columnIndex="2" GridPane.rowIndex="4">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="98.0" layoutY="11.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="(" GridPane.rowIndex="1">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" onAction="#processNumpad" prefHeight="64.0" prefWidth="95.0" style="-fx-background-color: #9E9D9B; -fx-text-fill: #FFFFFF;" text="3" GridPane.columnIndex="6" GridPane.rowIndex="3">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" onAction="#processNumpad" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #9E9D9B; -fx-text-fill: #FFFFFF;" text="2" GridPane.columnIndex="5" GridPane.rowIndex="3">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" onAction="#processNumpad" prefHeight="64.0" prefWidth="96.0" style="-fx-background-color: #9E9D9B; -fx-text-fill: #FFFFFF;" text="6" GridPane.columnIndex="6" GridPane.rowIndex="2">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" onAction="#processNumpad" prefHeight="64.0" prefWidth="98.0" style="-fx-background-color: #9E9D9B; -fx-text-fill: #FFFFFF;" text="9" GridPane.columnIndex="6" GridPane.rowIndex="1">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" onAction="#processNumpad" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #9E9D9B; -fx-text-fill: #FFFFFF;" text="8" GridPane.columnIndex="5" GridPane.rowIndex="1">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" prefHeight="64.0" prefWidth="96.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="±" GridPane.columnIndex="5">
                                 <font>
                                    <Font size="29.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" onAction="#processNumpad" prefHeight="58.0" prefWidth="76.0" style="-fx-background-color: #9E9D9B; -fx-text-fill: #FFFFFF;" text="1" GridPane.columnIndex="4" GridPane.rowIndex="3">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" onAction="#processNumpad" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #9E9D9B; -fx-text-fill: #FFFFFF;" text="4" GridPane.columnIndex="4" GridPane.rowIndex="2">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" onAction="#processNumpad" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #9E9D9B; -fx-text-fill: #FFFFFF;" text="5" GridPane.columnIndex="5" GridPane.rowIndex="2">
                                 <font>
                                    <Font size="35.0" />
                                 </font>
                              </Button>
                              <Button layoutX="10.0" layoutY="11.0" mnemonicParsing="false" onAction="#processNumpad" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #9E9D9B; -fx-text-fill: #FFFFFF;" text="7" GridPane.columnIndex="4" GridPane.rowIndex="1">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="619.0" layoutY="395.0" mnemonicParsing="false" prefHeight="100.0" prefWidth="81.0" style="-fx-background-color: #EE543A; -fx-text-fill: #FFFFFF;" text="\%" GridPane.columnIndex="6">
                                 <font>
                                    <Font size="29.0" />
                                 </font>
                              </Button>
                              <Button mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="π" GridPane.rowIndex="3">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="462.0" layoutY="202.0" mnemonicParsing="false" onAction="#processNumpad" prefHeight="64.0" prefWidth="95.0" style="-fx-background-color: #9E9D9B; -fx-text-fill: #FFFFFF;" text="." GridPane.columnIndex="6" GridPane.rowIndex="4">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button graphicTextGap="0.0" layoutX="172.0" layoutY="10.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="cosh" GridPane.columnIndex="1">
                                 <font>
                                    <Font name="System" size="22.0" />
                                 </font>
                              </Button>
                              <Button layoutX="172.0" layoutY="74.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="sinh" GridPane.columnIndex="1" GridPane.rowIndex="1">
                                 <font>
                                    <Font size="25.0" />
                                 </font>
                              </Button>
                              <Button layoutX="172.0" layoutY="138.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="tanh" GridPane.columnIndex="1" GridPane.rowIndex="2">
                                 <font>
                                    <Font name="System" size="24.0" />
                                 </font>
                              </Button>
                              <Button layoutX="91.0" layoutY="266.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="10?" GridPane.columnIndex="1" GridPane.rowIndex="3">
                                 <font>
                                    <Font size="30.0" />
                                 </font>
                              </Button>
                              <Button layoutX="253.0" layoutY="74.0" mnemonicParsing="false" prefHeight="96.0" prefWidth="92.0" style="-fx-background-color: #60646D; -fx-text-fill: #FFFFFF;" text="MR" GridPane.columnIndex="3">
                                 <font>
                                    <Font size="28.0" />
                                 </font>
                              </Button>
                           </children>
                        </GridPane>
                     </children>
                  </AnchorPane>
              </items>
            </SplitPane>
         </children>
      </AnchorPane>
   </children>
</fx:root>

New Main : structure

新主: 结构

回答by James_D

NullPointerException: Location is required

from the line where you are calling FXMLLoader.load(...)indicates that the URL you provided for the FXML file is null: i.e. the path to the resource is incorrect.

从您调用的行开始,您FXMLLoader.load(...)为 FXML 文件提供的 URL 是null:即资源路径不正确。

getClass().getResource()will search for a resource on the classpath relative to the current class. According to the screen shot you linked, Mainis in the package appicationand Calculatorview.fxmlis in application.view. So you need

getClass().getResource()将在相对于当前类的类路径上搜索资源。根据您链接的屏幕截图,Main在包中appication并且Calculatorview.fxmlapplication.view. 所以你需要

Parent root = FXMLLoader.load(getClass().getResource("view/Calculatorview.fxml"));

Alternatively, you can specify the fxml file relative to the classpath (instead of relative to the current class):

或者,您可以指定相对于类路径(而不是相对于当前类)的 fxml 文件:

Parent root = FXMLLoader.load(getClass().getResource("/application/view/Calculatorview.fxml"));

(note the additional leading /compared to your code).

(请注意/与您的代码相比的额外领先)。

Note, of course, that this path is being searched at runtime, so you need to make sure the fxml file is deployed along with the classfiles when the code is compiled. In other words, if Mainand Calculatorview.fxmlare in the package application, somewhere you should have a folder called applicationcontaining Main.class(note, class file) and Calculatorview.fxml. This would typically be in a folder called binor classes, depending on your IDE and its setup (or you will have the applicationstructure in a jar file, if you're building a jar).

请注意,当然,此路径是在运行时搜索的,因此您需要确保在编译代码时将fxml 文件与文件一起部署。换句话说,如果MainCalculatorview.fxml都在包中application,那么在某处你应该有一个名为applicationcontains Main.class(note, class file) and的文件夹Calculatorview.fxml。这通常位于名为binor的文件夹中classes,具体取决于您的 IDE 及其设置(或者application,如果您正在构建一个 jar,则该结构将位于 jar 文件中)。

回答by Raf

Alright. I tried to setup my environment with Java 1.8 and tried the tutorial from the provided link. Here is what I did.

好吧。我尝试使用 Java 1.8 设置我的环境并尝试了提供的链接中的教程。这是我所做的。

  1. Installed Elcipse Kepler (Java EE)
  2. Followed instructions here for e(fx)clipse https://www.eclipse.org/efxclipse/install.html
  3. Installed all the libs/jars as shown below
  1. 安装 Elcipse Kepler (Java EE)
  2. 按照此处的说明获取 e(fx)clipse https://www.eclipse.org/efxclipse/install.html
  3. 安装所有的库/罐,如下所示

enter image description here

在此处输入图片说明

After above, I create a new Java project in the eclipse. I right clicked on the project and created two Source Foldersnamely

在上面之后,我在 eclipse 中创建了一个新的 Java 项目。我右键单击该项目并创建了两个源文件夹,

src/main/java 
src/main/resources 

Then I right clicked on the src/main/java and created new package and named it application. Under application I created 4 java classes and copied across the content from the tutorial link. I did modify the package on top of each java file to reflect the applicationonly.

然后我右键单击 src/main/java 并创建新包并将其命名为application。在应用程序下,我创建了 4 个 java 类并从教程链接复制了整个内容。我确实修改了每个 java 文件顶部的包以仅反映应用程序

Here are the java classes

这是java类

package application;

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

public class App extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("/ui.fxml"));

        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

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

Controller

控制器

 package application;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.text.Text;

public class Controller {

    @FXML
    private Text output;

    private long number1 = 0;
    private String operator = "";
    private boolean start = true;

    private Model model = new Model();

    @FXML
    private void processNumpad(ActionEvent event) {
        if (start) {
            output.setText("");
            start = false;
        }

        String value = ((Button)event.getSource()).getText();
        output.setText(output.getText() + value);
    }

    @FXML
    private void processOperator(ActionEvent event) {
        String value = ((Button)event.getSource()).getText();

        if (!"=".equals(value)) {
            if (!operator.isEmpty())
                return;

            operator = value;
            number1 = Long.parseLong(output.getText());
            output.setText("");
        }
        else {
            if (operator.isEmpty())
                return;

            output.setText(String.valueOf(model.calculate(number1, Long.parseLong(output.getText()), operator)));
            operator = "";
            start = true;
        }
    }
}

Model

模型

package application;

public class Model {

    public long calculate(long number1, long number2, String operator) {
        switch (operator) {
            case "+":
                return number1 + number2;
            case "-":
                return number1 - number2;
            case "*":
                return number1 * number2;
            case "/":
                if (number2 == 0)
                    return 0;

                return number1 / number2;
        }

        System.out.println("Unknown operator - " + operator);
        return 0;
    }
}

and ui.fxml

和 ui.fxml

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

<?import java.net.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.beans.property.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.shape.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.paint.Color?>

<VBox spacing="10" alignment="CENTER" prefWidth="300" prefHeight="300" fx:controller="application.Controller" xmlns:fx="http://javafx.com/fxml">
    <fx:define>
        <Font fx:id="FONT" size="18" />
    </fx:define>

    <StackPane alignment="CENTER">
        <Rectangle fill="TRANSPARENT" stroke="GRAY" width="230" height="50" />
        <Text fx:id="output" font="$FONT" />
    </StackPane>

    <HBox spacing="10" alignment="CENTER">
        <Button text="7" prefWidth="50" font="$FONT" onAction="#processNumpad" />
        <Button text="8" prefWidth="50" font="$FONT" onAction="#processNumpad" />
        <Button text="9" prefWidth="50" font="$FONT" onAction="#processNumpad" />
        <Button text="/" prefWidth="50" font="$FONT" onAction="#processOperator" />
    </HBox>

    <HBox spacing="10" alignment="CENTER">
        <Button text="4" prefWidth="50" font="$FONT" onAction="#processNumpad" />
        <Button text="5" prefWidth="50" font="$FONT" onAction="#processNumpad" />
        <Button text="6" prefWidth="50" font="$FONT" onAction="#processNumpad" />
        <Button text="*" prefWidth="50" font="$FONT" onAction="#processOperator" />
    </HBox>

    <HBox spacing="10" alignment="CENTER">
        <Button text="1" prefWidth="50" font="$FONT" onAction="#processNumpad" />
        <Button text="2" prefWidth="50" font="$FONT" onAction="#processNumpad" />
        <Button text="3" prefWidth="50" font="$FONT" onAction="#processNumpad" />
        <Button text="-" prefWidth="50" font="$FONT" onAction="#processOperator" />
    </HBox>

    <HBox spacing="10" alignment="CENTER">
        <Button text="0" prefWidth="110" font="$FONT" onAction="#processNumpad" />
        <Button text="=" prefWidth="50" font="$FONT" onAction="#processOperator" />
        <Button text="+" prefWidth="50" font="$FONT" onAction="#processOperator" />
    </HBox>

</VBox>

I had issues with Java source library (reference to JRE) and the jfxrt.jar files. So I did the following

我遇到了 Java 源库(参考 JRE)和 jfxrt.jar 文件的问题。所以我做了以下

  1. Removed the referenced library
  2. Removed the external jar that was referenced
  3. Right clicked on the project and choose Properties
  4. Choose Java Build Path
  5. Clicked on Add Libraryon the right side of the window and added JRE System Libraryas shown below
  6. Added external jar jfxrt.jar
  1. 删除了引用的库
  2. 删除了引用的外部 jar
  3. 右键单击项目并选择属性
  4. 选择Java 构建路径
  5. 点击窗口右侧的Add Library,添加JRE System Library如下图
  6. 添加外部 jar jfxrt.jar

enter image description here

在此处输入图片说明

After adding the above, the code was resolved and there were no issues.

添加以上后,代码就解决了,没有问题了。

Remember, I placed ui.fxmlunder src/main/resourcesfolder. So when I run the project as Java Applicationinitially, it complained and give me the same exception as you are facing. So I changed the "ui.fxml" to "/ui.fxml" and boom, I saw the calculator.

请记住,我将ui.fxml放在src/main/resources文件夹下。因此,当我最初将项目作为Java 应用程序运行时,它抱怨并给了我与您面临的相同的异常。于是我把“ui.fxml”改成了“/ui.fxml”,然后boom,我看到了计算器。

Parent root = FXMLLoader.load(getClass().getResource("/ui.fxml"));

See below the screenshot, I hope these steps help.

请看下面的截图,我希望这些步骤有帮助。

enter image description here

在此处输入图片说明