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?