【问题标题】:Location is required in JavaFX with gradle使用 gradle 的 JavaFX 中需要位置
【发布时间】:2014-02-03 09:42:13
【问题描述】:

我明白了

java.lang.NullPointerException:需要位置。

当我使用带有 javafx 插件的 gradle 组装后运行我的程序时。如果我从 IntelliJ Idea 运行它,一切都很好。 Java 源文件和 .fxml 位于某个包中。

build.gradle

apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'idea'
apply from: 'javafx.plugin'

javafx {
    javaRuntime = 'C:\\Program Files\\Java\\jdk1.7.0_45'

    appID 'FXMLExample'
    appName 'fxml example application'
    mainClass 'local.hz.FXMLExample'
}

task "create-dirs" {
    sourceSets*.java.srcDirs*.each {it.mkdirs()}
    sourceSets*.resources.srcDirs*.each {it.mkdirs()}
}

fxml_example.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import java.net.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<GridPane fx:controller="local.hz.FXMLExampleController"
      xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
<padding><Insets top="25" right="25" bottom="10" left="25"/></padding>
<gridLinesVisible>true</gridLinesVisible>

<Text text="Welcome"
      GridPane.columnIndex="0" GridPane.rowIndex="0"
      GridPane.columnSpan="2"/>

<Label text="User Name:"
      GridPane.columnIndex="0" GridPane.rowIndex="1"/>

<TextField
      GridPane.columnIndex="1" GridPane.rowIndex="1"/>

<Label text="Password:"
      GridPane.columnIndex="0" GridPane.rowIndex="2"/>

<PasswordField fx:id="passwordField"
               GridPane.columnIndex="1" GridPane.rowIndex="2"/>

<HBox spacing="10" alignment="bottom_right"
      GridPane.columnIndex="1" GridPane.rowIndex="4">
    <Button text="Sign In"
            onAction="#handleSubmitButtonAction"/>
</HBox>

<Text fx:id="actiontarget"
      GridPane.columnIndex="1" GridPane.rowIndex="6"/>
</GridPane>

FXMLExample.java

package local.hz;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class FXMLExample extends Application {
@Override
public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml"));

    Scene scene = new Scene(root,300,275);

    stage.setTitle("FXML WELCOME!!");
    stage.setScene(scene);
    stage.show();
}

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

【问题讨论】:

    标签: javafx gradle


    【解决方案1】:

    我真的迟到了……但是接受没有用。我(随机)将“javafx.fxml”添加到模块列表中,如下所示

    javafx {
        version = "14"
        modules = [ 'javafx.controls', 'javafx.fxml']
    }
    

    ...它解决了这个问题。

    【讨论】:

      【解决方案2】:

      实际上,使用 Gradle 加载资源可能与使用 IDE 资源系统不同。

      最好使用类加载器:

      URL myFxmlURL = ClassLoader.getSystemResource("fxml_example.fxml");
      FXMLLoader loader = new FXMLLoader(sampleUrl);
      
      Parent root = loader.load(myFxmlURL);
      

      【讨论】:

        【解决方案3】:

        您的 FXML 文件可能没有打包到您的 jar 中。

        尝试将其添加到您的 build.gradle 文件中:

        sourceSets {
          main {
            resources {
                srcDirs = ["src/main/java"]
                includes = ["**/*.fxml"]
            }
          }
        }
        

        【讨论】:

        • 这个答案是正确的。问题的作者可以接受。
        • 感谢@KonradG。为我工作。
        • 如果你把*.fxml放在有你的代码的包下面,你应该写srcDirs = ["path/to/your/code/root/"]
        • 我只是这个回复节省了我的一天并帮助我正确运行我的 JavaFX 应用程序的人。谢谢!我的项目中没有外部资源目录。只是主类应用程序同一根目录中的“视图”目录。我像 getResource("views/main.fxml")); 那样加载我的主要 fxml;
        【解决方案4】:

        尝试替换:

        javaRuntime = 'C:\\Program Files\\Java\\jdk1.7.0_45'
        

        与:

        javaRuntime = 'C:/Program Files/Java/jdk1.7.0_45'
        

        【讨论】:

        • 这些是相同的路径。
        猜你喜欢
        • 2019-03-26
        • 2014-03-26
        • 1970-01-01
        • 2013-12-28
        • 1970-01-01
        • 1970-01-01
        • 2015-04-18
        • 1970-01-01
        • 2016-09-25
        相关资源
        最近更新 更多