multiple browsers in JTabbedPane

Having problems with building or using CEF's C/C++ APIs? This forum is here to help. Please do not post bug reports or feature requests here.

multiple browsers in JTabbedPane

Postby arunkumar » Wed Dec 17, 2014 10:28 am

Hi,

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.

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

Re: multiple browsers in JTabbedPane

Postby arunkumar » Wed Dec 17, 2014 10:30 am

I am using the following versions

JCEF Version = 3.2171.1902.112
CEF Version = 3.2171.1902
Chromium Version = 39.0.2171.36
arunkumar
Techie
 
Posts: 22
Joined: Sat Mar 01, 2014 10:41 pm

Re: multiple browsers in JTabbedPane

Postby arunkumar » Sun Dec 21, 2014 11:52 pm

Can someone pls guide or post any help?? Any help/suggestions is highly appreciated. Thanks in advance.
arunkumar
Techie
 
Posts: 22
Joined: Sat Mar 01, 2014 10:41 pm

Re: multiple browsers in JTabbedPane

Postby arunkumar » Thu Jan 08, 2015 2:26 am

Hi,

I have attached the code for running multiple browsers. Please suggest why using browse.close() terminates the app and any flaws in the code. Thanks for your suggestions/help.

Browser.java


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);
  }
}



BrowserSample.java


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();
    }
  }
}
arunkumar
Techie
 
Posts: 22
Joined: Sat Mar 01, 2014 10:41 pm


Return to Support Forum

Who is online

Users browsing this forum: No registered users and 35 guests