multiple browsers in JTabbedPane

Having problems with building or using the JCEF Java binding? Ask your questions here.

multiple browsers in JTabbedPane

Postby arunkumar » Wed Feb 04, 2015 1:27 am

Hi,

I have already approached the support forum for help http://www.magpcss.org/ceforum/viewtopic.php?f=6&t=12521 , since I got no inputs am re-posting here as a new topic. Please help/guide me on the same.

I am trying to embed multiple browsers in jtabbedpane and close each browser when the tab is closed using browser.close() method, but the application terminates. if i remove the browser.close() then the application works fine.

I am also getting MS VC++ redistributable related Java Virtual Function call error message at random and the application terminates. I'll attach the code if needed.

Pls suggest/provide samples on how to efficiently add browser to tabs and remove them after processing and create new instances of the browser.

I am using the following versions

JCEF Version = 3.2171.1902.112
CEF Version = 3.2171.1902
Chromium Version = 39.0.2171.36

I have attached the source code of the test codes. Here, I am creating 2 browser tabs inside the jtabbedPane and closing them using timer class and creating new browsers in the tabs at regular intervals. The application runs and terminates at random intervals. Please guide me on clearing this error.

Code: Select all
   
    package tests.multitab;

    import java.awt.BorderLayout;

    import javax.swing.JComponent;
    import javax.swing.JPanel;

    import org.apache.log4j.Logger;
    import org.cef.CefApp;
    import org.cef.CefApp.CefVersion;
    import org.cef.CefClient;
    import org.cef.CefSettings;
    import org.cef.browser.CefBrowser;
    import org.cef.browser.CefMessageRouter;
    import org.cef.handler.CefDisplayHandlerAdapter;
    import org.cef.handler.CefLoadHandlerAdapter;

    import tests.detailed.dialog.DownloadDialog;
    import tests.detailed.handler.AppHandler;
    import tests.detailed.handler.ContextMenuHandler;
    import tests.detailed.handler.DragHandler;
    import tests.detailed.handler.GeolocationHandler;
    import tests.detailed.handler.JSDialogHandler;
    import tests.detailed.handler.KeyboardHandler;
    import tests.detailed.handler.MessageRouterHandler;
    import tests.detailed.handler.MessageRouterHandlerEx;
    import tests.detailed.handler.RequestHandler;
    import tests.detailed.ui.ControlPanel;
    import tests.detailed.ui.StatusPanel;

    public class Browser extends JComponent {

      /**
        *
        */
      static final Logger log = Logger.getLogger(Browser.class);

      private static final long serialVersionUID = 5804446936520928286L;
      private final CefClient client_;
      private String errorMsg_ = "";
      private final CefBrowser browser_;
      private ControlPanel control_pane_;
      private StatusPanel status_panel_;
     
      public Browser(String url, String userAgent, String sotreId) {
        super();
       
        CefSettings settings = new CefSettings();
        settings.windowless_rendering_enabled = false;
        // try to load URL "about:blank" to see the background color
        settings.background_color = settings.new ColorType(100, 255, 242, 211);
        CefApp myApp = null;
        try {
          myApp = CefApp.getInstance(null, settings);
          CefApp.addAppHandler(new AppHandler(null));
        } catch (IllegalStateException e) {
          myApp = CefApp.getInstance();
        }
       
        CefVersion version = myApp.getVersion();
        log.info("Using Version:" + version);

        client_ = myApp.createClient();

        DownloadDialog downloadDialog = new DownloadDialog();
        client_.addContextMenuHandler(new ContextMenuHandler());
        client_.addDownloadHandler(downloadDialog);
        client_.addDragHandler(new DragHandler());
        client_.addGeolocationHandler(new GeolocationHandler());
        client_.addJSDialogHandler(new JSDialogHandler());
        client_.addKeyboardHandler(new KeyboardHandler());
        client_.addRequestHandler(new RequestHandler(userAgent, sotreId));

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

        client_.addDisplayHandler(new CefDisplayHandlerAdapter() {
          @Override
          public void onAddressChange(CefBrowser browser, String url) {
            control_pane_.setAddress(browser, url);
          }

          @Override
          public void onTitleChange(CefBrowser browser, String title) {
            // setTitle(title);
            log.info("Current Title: " + title);
          }

          @Override
          public void onStatusMessage(CefBrowser browser, String value) {
            status_panel_.setStatusText(value);
          }
        });
       
        client_.addLoadHandler(new CefLoadHandlerAdapter() {
          @Override
          public void onLoadingStateChange(CefBrowser browser, boolean isLoading, boolean canGoBack,
              boolean canGoForward) {
            control_pane_.update(browser, isLoading, canGoBack, canGoForward);
            status_panel_.setIsInProgress(isLoading);

            if (!isLoading && !errorMsg_.isEmpty()) {
              browser.loadString(errorMsg_, control_pane_.getAddress());
              errorMsg_ = "";
            }
          }

          @Override
          public void onLoadError(CefBrowser browser, int frameIdentifer, ErrorCode errorCode,
              String errorText, String failedUrl) {
            if (errorCode != ErrorCode.ERR_NONE && errorCode != ErrorCode.ERR_ABORTED) {
              /*
              errorMsg_ = "<html><head>";
              errorMsg_ += "<title>Error while loading</title>";
              errorMsg_ += "</head><body>";
              errorMsg_ += "<h1>" + errorCode + "</h1>";
              errorMsg_ += "<h3>Failed to load " + failedUrl + "</h3>";
              errorMsg_ += "<p>" + (errorText == null ? "" : errorText) + "</p>";
              errorMsg_ += "</body></html>";
              browser.stopLoad();
              log.error("OnLoadError: " + (errorText == null ? "" : errorText));
              */
            }
          }
        });
       
        browser_ = client_.createBrowser(url, false, false);
      }

      // Last but not least we're setting up the UI for this example
      // implementation.
      public JPanel getView() {
        JPanel contentPanel = new JPanel(new BorderLayout());
        control_pane_ = new ControlPanel(browser_);
        status_panel_ = new StatusPanel();
        contentPanel.add(control_pane_, BorderLayout.NORTH);

        // 4) By calling getUIComponen() on the CefBrowser instance, we receive
        // an displayable UI component which we can add to our application.
        contentPanel.add(browser_.getUIComponent(), BorderLayout.CENTER);

        contentPanel.add(status_panel_, BorderLayout.SOUTH);
        return contentPanel;
      }
     
      public void closeBrowser() {
        browser_.close();
      }
     
      public String getUrl() {
        return browser_.getURL();
      }
     
      public void loadUrl(String url) {
        browser_.loadURL(url);
      }
     
      public void setHtmlContent(String value, String url) {
        browser_.loadString(value, url);
      }
    }



Code: Select all
    package tests.multitab;

    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.util.Random;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ScheduledFuture;
    import java.util.concurrent.ScheduledThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;

    import javax.swing.JFrame;
    import javax.swing.JTabbedPane;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;

    import org.apache.log4j.Logger;
    import org.cef.CefApp;

    public class BrowserSample {
     
      final static String[] urls = {"http://google.com", "http://yahoo.com", "http://cefbuilds.com"};
      static final Logger log = Logger.getLogger(BrowserSample.class);

      public static void main(String[] args) {

        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
              // MainFrame keeps all the knowledge to display the embedded browser
              // frame.
              final JFrame frame = new JFrame();
              final JTabbedPane tabbedPane = new JTabbedPane();

              frame.getContentPane().add(tabbedPane);
              frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                  frame.dispose();
                  CefApp.getInstance().dispose();
                  System.exit(0);
                }
              });

              frame.setSize(800, 600);
              frame.setVisible(true);

              createBrowsers(tabbedPane);
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException
                | UnsupportedLookAndFeelException e) {
              log.error("Exception initializing the look and feel", e);
            }
         
      }

      public static void createBrowsers(final JTabbedPane pane) {
        log.info("loading browsers...");
        int idx = new Random().nextInt(urls.length);
        String randomUrl = (urls[idx]);
        Browser browser1 = new Browser(randomUrl, null, null);
        pane.addTab("Chrome Browser-1", browser1.getView());

        idx = new Random().nextInt(urls.length);
        randomUrl = (urls[idx]);
        Browser browser2 = new Browser(randomUrl, null, null);
        pane.addTab("Chrome Browser-2", browser2.getView());

        scheduler(pane, browser1, browser2);
      }

      public static void closeBrowsers(final JTabbedPane pane, final Browser browser1, final Browser browser2) {
        log.info("Removing browsers...");
        browser1.closeBrowser();
        browser2.closeBrowser();
        pane.removeAll();
      }

      public static void scheduler(final JTabbedPane pane, final Browser browser1,
          final Browser browser2) {
        ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
        ScheduledFuture<?> scheduledFuture = exec.schedule(new Callable<Object>() {
          @Override
          public Object call() throws Exception {
            closeBrowsers(pane, browser1, browser2);
            createBrowsers(pane);
            return "Called!";
          }
        }, 20, TimeUnit.SECONDS); // execute every 20 seconds
        try {
          System.out.println("result = " + scheduledFuture.get());
        } catch (InterruptedException | ExecutionException e) {
          e.printStackTrace();
        }
      }
    }


Thanks,
Arun
arunkumar
Techie
 
Posts: 22
Joined: Sat Mar 01, 2014 10:41 pm

Return to JCEF Forum

Who is online

Users browsing this forum: No registered users and 18 guests