Search code examples
jxbrowser

JxBrowser not connecting


I am having troubles to make the jxbrowser work outside of the development environment. When I run it in eclipse it works fine, but when I compile it and run the screen doesn't seems to load. Here is the code that I'm using:

browser = new Browser();
com.teamdev.jxbrowser.chromium.swing.BrowserView view = new com.teamdev.jxbrowser.chromium.swing.BrowserView(browser);
javax.swing.JFrame frame = new javax.swing.JFrame();
frame.add(view, java.awt.BorderLayout.CENTER);
frame.setSize(800, 450);
frame.setVisible(true);
browser.loadURL(Main.class.getResource("/assets/engine.html").toExternalForm());

> When I run from eclipse <

> When I compile and run <

Am I missing something?


Solution

  • If your HTML resource "/assets/engine.html" is located inside the RPGItems.jar after build, the path to it will not be resolved properly by the Chromium engine by default. To be able to load resources located inside JAR archive you must register custom ProtocolHandler with the following implementation:

    BrowserContext browserContext = browser.getContext();
    ProtocolService protocolService = browserContext.getProtocolService();
    protocolService.setProtocolHandler("jar", new ProtocolHandler() {
        @Override
        public URLResponse onRequest(URLRequest request) {
            try {
                URLResponse response = new URLResponse();
                URL path = new URL(request.getURL());
                InputStream inputStream = path.openStream();
                DataInputStream stream = new DataInputStream(inputStream);
                byte[] data = new byte[stream.available()];
                stream.readFully(data);
                response.setData(data);
                String mimeType = getMimeType(path.toString());
                response.getHeaders().setHeader("Content-Type", mimeType);
                return response;
            } catch (Exception ignored) {}
            return null;
        }
    });
    

    The getMimeTypemethod here returns appropriate mime type for the given resource extension:

    private static String getMimeType(String path) {
        if (path.endsWith(".html")) {
            return "text/html";
        }
        if (path.endsWith(".css")) {
            return "text/css";
        }
        if (path.endsWith(".js")) {
            return "text/javascript";
        }
        return "text/html";
    }
    

    Once you register ProtocolHandler and define what mime types are supported, you can load resources from JAR archive using standard Java and JxBrowser API:

    browser.loadURL(Main.class.getResource("/assets/engine.html").toString());