Skip to content

Instantly share code, notes, and snippets.

@TW2
Created April 19, 2024 19:20
Show Gist options
  • Save TW2/44765af094a1436474c4861685100662 to your computer and use it in GitHub Desktop.
Save TW2/44765af094a1436474c4861685100662 to your computer and use it in GitHub Desktop.
JavaFX custom tag permits to integrate image in the webpage
package org.wingate.webimg;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import org.w3c.dom.Document;
import org.w3c.dom.html.HTMLImageElement;
/**
*
* @author util2
*/
public class Webimg extends javax.swing.JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
Webimg wi = new Webimg();
wi.setTitle("WebIMG");
wi.setSize(1000, 600);
wi.setLocationRelativeTo(null);
wi.setVisible(true);
});
}
private final JFXPanel fxPane;
private WebView browser;
private WebEngine webEngine;
private JFileChooser fcOpenImage;
public Webimg() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
fxPane = new JFXPanel();
getContentPane().setLayout(new BorderLayout());
getContentPane().add(fxPane, BorderLayout.CENTER);
fcOpenImage = new JFileChooser();
for(FileFilter ff : fcOpenImage.getChoosableFileFilters()){
fcOpenImage.removeChoosableFileFilter(ff);
}
fcOpenImage.addChoosableFileFilter(new FileFilter(){
private final List<String> extensions = Arrays.asList(new String[]{ ".png", ".jpg" });
@Override
public boolean accept(File f) {
String name = f.getName();
if(f.isDirectory()) return true;
return extensions.contains(name.substring(name.lastIndexOf(".")));
}
@Override
public String getDescription() {
return "Image (*.png, *.jpg)";
}
});
Platform.runLater(() -> {
browser = new WebView();
webEngine = browser.getEngine();
Group root = new Group();
Scene scene = new Scene(root, fxPane.getWidth(), fxPane.getHeight());
browser.setPrefSize(fxPane.getWidth(), fxPane.getHeight());
root.getChildren().add(browser);
fxPane.setScene(scene);
int z = fcOpenImage.showOpenDialog(this);
if(z == JFileChooser.APPROVE_OPTION){
insertImage(fcOpenImage.getSelectedFile().toURI().toString());
}
openTextContent("<onDemandUrl/>");
});
}
private void openTextContent(String text){
Platform.runLater(() -> {
webEngine.loadContent(text);
});
}
private void insertImage(String path){
Platform.runLater(() -> {
webEngine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
if(javafx.concurrent.Worker.State.SUCCEEDED.equals(newState)){
Document doc = webEngine.getDocument();
HTMLImageElement e = (HTMLImageElement)doc.createElement("img");
e.setSrc(path);
doc.getElementsByTagName("onDemandUrl").item(0).appendChild(e);
}
});
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment