Hugo Stiglits
Hugo Stiglits

Reputation: 101

Location is required in JavaFX with gradle

I'm getting

java.lang.NullPointerException: Location is required.

when I run my program after assembling using gradle with javafx plugin. If I run it from IntelliJ Idea, everything is all right. The Java source files and .fxml are locate in some package.

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);
}
}

Upvotes: 10

Views: 8576

Answers (4)

MelS
MelS

Reputation: 119

I'm really late to the party...but the accepted didn't work. I (randomly) added 'javafx.fxml' to the list of modules, like this

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

...and it solved the issue.

Upvotes: 5

Laurent Alvaro
Laurent Alvaro

Reputation: 21

Actually, loading a resource with Gradle might be different from using your IDE resource system.

It is better to use the ClassLoader :

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

Parent root = loader.load(myFxmlURL);

Upvotes: 1

Phil C
Phil C

Reputation: 431

Your FXML files are probably not packaged into your jar.

Try adding this to your build.gradle file:

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

Upvotes: 29

akhikhl
akhikhl

Reputation: 2578

Try replacing:

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

with:

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

Upvotes: -3

Related Questions