JavaFX Webview Inteliji, błąd: java.lang.NullPointerException

0

Już od jakiegoś czasu męczę się z napisaniem prostego programu korzystającego z JavaFX i Webview.
Z początku miałem problem w ogóle z instalacją biblioteki JavaFX. Próbowałem Mavenem, i dodać biblioteki w ustawieniach IDE "project structure -> add module". I cały czas wywalało jakiś błąd.

Dopiero ręczne zmodyfikowanie plików module-info.java i pom.xml zadziałało.

module-info.java:

module sample {
    requires javafx.controls;
    requires javafx.fxml;
    requires javafx.web;
    requires javafx.media;
    requires javafx.graphics;
    requires javafx.base;


    opens sample to javafx.fxml;
    exports sample;
}

Aby zmodyfikować plik pom.xml musiałem samemu wejść na stronę
https://mvnrepository.com/artifact/org.openjfx/javafx-web/13.0.1
i po kolei ręcznie przepisać wszystkie zależności.

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>sample</groupId>
    <artifactId>PrzykladFX</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>11.0.2</version>
        </dependency>
        <dependency>
           <groupId>org.openjfx</groupId>
           <artifactId>javafx-web</artifactId>
           <version>13</version>
        </dependency>
		<dependency>
          <groupId>org.openjfx</groupId>
          <artifactId>javafx-media</artifactId>
          <version>13.0.1</version>
        </dependency>
        <dependency>
           <groupId>org.openjfx</groupId>
           <artifactId>javafx-graphics</artifactId>
           <version>13.0.1</version>
      </dependency>
      <dependency>
          <groupId>org.openjfx</groupId>
          <artifactId>javafx-base</artifactId>
          <version>13.0.1</version>
    </dependency>	
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.1</version>
                <configuration>
                    <mainClass>sample.App</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Main class:

package sample;

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

import java.io.IOException;

/**
 * JavaFX App
 */
public class App extends Application {

    private static Scene scene;

    @Override
    public void start(Stage stage) throws IOException {
        scene = new Scene(loadFXML("layout"), 400, 500);
        stage.setScene(scene);
        stage.show();
    }

    static void setRoot(String fxml) throws IOException {
        scene.setRoot(loadFXML(fxml));
    }

    private static Parent loadFXML(String fxml) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
        return fxmlLoader.load();
    }

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

}

MyWindow.java:

package sample;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
import javafx.scene.web.WebView;
import javafx.scene.web.WebEngine;

public class MyWindow{

    @FXML
    private WebView webView;
    private WebEngine browser;

    @FXML
    private void initialize() {
        WebEngine browser = webView.getEngine();
            browser.load("http:://www.google.com");
    }

}

layout.fxml:

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

<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.web.*?>

<VBox alignment="CENTER" spacing="20.0" stylesheets="@style.css" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.MyWindow">
    <children>
    </children>
    <padding>
        <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
    </padding>
    <Label styleClass="klasa" />

    <WebView fx:id="mywebview" layoutX="102.0" layoutY="20.0" prefHeight="127.0" prefWidth="200.0" />

    <Button fx:id="button" text="button" />
</VBox>

Program wywala błąd:

Caused by: java.lang.NullPointerException
	at sample/sample.SecondaryController.initialize(SecondaryController.java:23)
	... 24 more
Exception running application sample.App

Process finished with exit code 1

kiedy metoda initialize() jest pusta

  @FXML
    private void initialize() {
    }

Program wtedy działa. Okno Webview jest po prostu białe/puste. Czy ktoś ma pomysł co może być nie tak?

1

W FXMLu twoje webview ma fx:id="mywebview, w kontrolerze zaś masz @FXML private WebView webView;. Nazwa pola w kontrolerze i fx:id musi się pokrywać z tego co pamiętam.

0

Fakt.
Tyle się nad tym męczę, ze nie pomyślał bym, że błąd może być taki prosty.

Teraz wszystko działa. Dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1