Page 1 of 1

JCEF Browser does not content; only blank screen on Eclipse

PostPosted: Thu Jan 20, 2022 9:29 pm
by a2646
I have been trying to get the Java version of Chromium Embedded Framework (JCEF) to work on Eclipse for some time. I am able to verify that the library files are working correctly, since if I run the included sample class files on the VM, the program runs and some webpage is displayed. However, if I run the program from Eclipse, the program will always display a blank window. I am able to verify that the library binary jcef_helper.exe is successfully run, but not matter how I link the .jar files and other library files, the webpage will not generate and there will always be a blank screen. I cannot pinpoint the issue here. I tried specifying path, adding the JCEF library path of my OS environment variables PATH field to no avail. I have followed the documentation, even sample files behave the same way when I have anything to do with compilation/ run. One note of interest, my Eclipse console will display this during run:

Code: Select all
initialize on Thread[AWT-EventQueue-0,6,main]


Perhaps there is a thread issue?

Code in question:

Code: Select all
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import org.cef.CefApp;
import org.cef.CefApp.CefAppState;
import org.cef.CefClient;
import org.cef.CefSettings;
import org.cef.browser.CefBrowser;
import org.cef.handler.CefAppHandlerAdapter;

public class WebV
{
    public static void main(String args[])
    {
        Dimension dispDimension = Toolkit.getDefaultToolkit().getScreenSize();
        int width = (int)Math.round(dispDimension.getWidth() / 2);
        int height = (int)Math.round(dispDimension.getHeight() / 2);

        CefApp.addAppHandler(new CefAppHandlerAdapter(null)
        {
            @Override
            public void stateHasChanged(CefAppState state)
            {
                if(state == CefAppState.TERMINATED)
                {
                    System.exit(0);
                }
            }
        });
        CefSettings settings = new CefSettings();
        settings.windowless_rendering_enabled = false;
        CefApp cefApp = CefApp.getInstance(settings);
        CefClient client = cefApp.createClient();
        CefBrowser browser = client.createBrowser("http://www.google.com", false, false);
        Component browserComponent = browser.getUIComponent();

        JFrame frame = new JFrame();
        frame.setTitle("WebV");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(width, height);
        frame.setResizable(true);
        frame.setLocationRelativeTo(null);

        frame.add(browserComponent);
        frame.setVisible(true);
    }
}


Tested with both Java 17 and Java 8. Run on Eclipse, with VM args:

Code: Select all
-Djava.library.path=./bin/lib/win64


Any inupt would be greatly appreicated.

Re: JCEF Browser does not content; only blank screen on Ecli

PostPosted: Thu Feb 10, 2022 1:51 pm
by Yanovsky
Hello.
You need add MessageRouter to CefClient object.

MessageRouterHandler and MessageRouterHandlerEx you can find in tests project on https://github.com/chromiumembedded/java-cef

It should look something like this:
Code: Select all
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import org.cef.CefApp;
import org.cef.CefApp.CefAppState;
import org.cef.CefClient;
import org.cef.CefSettings;
import org.cef.browser.CefBrowser;
import org.cef.handler.CefAppHandlerAdapter;

import org.cef.browser.CefMessageRouter;
import tests.detailed.handler.MessageRouterHandler;
import tests.detailed.handler.MessageRouterHandlerEx;

public class WebV
{
    public static void main(String args[])
    {
        Dimension dispDimension = Toolkit.getDefaultToolkit().getScreenSize();
        int width = (int)Math.round(dispDimension.getWidth() / 2);
        int height = (int)Math.round(dispDimension.getHeight() / 2);

        CefApp.addAppHandler(new CefAppHandlerAdapter(null)
        {
            @Override
            public void stateHasChanged(CefAppState state)
            {
                if(state == CefAppState.TERMINATED)
                {
                    System.exit(0);
                }
            }
        });
        CefSettings settings = new CefSettings();
        settings.windowless_rendering_enabled = false;
        CefApp cefApp = CefApp.getInstance(settings);
        CefClient client = cefApp.createClient();

        CefMessageRouter msgRouter = CefMessageRouter.create();
        msgRouter.addHandler(new MessageRouterHandler(), true);
        msgRouter.addHandler(new MessageRouterHandlerEx(client), false);
        client.addMessageRouter(msgRouter);

        CefBrowser browser = client.createBrowser("http://www.google.com", false, false);
        Component browserComponent = browser.getUIComponent();

        JFrame frame = new JFrame();
        frame.setTitle("WebV");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(width, height);
        frame.setResizable(true);
        frame.setLocationRelativeTo(null);

        frame.add(browserComponent);
        frame.setVisible(true);
    }
}

Re: JCEF Browser does not content; only blank screen on Ecli

PostPosted: Fri Feb 11, 2022 7:34 am
by a2646
I am incredibly grateful that you've taken the time to reply. This solution has worked and everything is working as expected. This will help me greatly. Oddly enough, the sample java file for the simple usage case does not contain this code. I will make sure to notify the maintainer of this. Your solution has resolved the issue completely. Once again, thank you for this.

Re: JCEF Browser does not content; only blank screen on Ecli

PostPosted: Sun Feb 13, 2022 5:10 am
by FriwiDev