【SOLVED】Can't set focus on a browser with multiple browser.

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

【SOLVED】Can't set focus on a browser with multiple browser.

Postby micrikit » Mon Sep 19, 2022 8:37 pm

Hi.
I coded multiple browser program.
I want to focus on the right side browser when launch the program.
I thought setFocus or requestFocus is fit my idea , but both doesn't work.
(if browser get focus, then "onGotFocus" shows on the console)
Can someone have some idea?

here's my code below.
*I coded this for test, and sometimes browsers doesn't show correctly, but that's ok for now.
if that happen, restart the program.

Code: Select all
package test;

import java.awt.Color;
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.HashMap;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

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.browser.CefFrame;
import org.cef.handler.CefAppHandlerAdapter;
import org.cef.handler.CefDisplayHandlerAdapter;
import org.cef.handler.CefFocusHandlerAdapter;
import org.cef.handler.CefKeyboardHandler;
import org.cef.misc.BoolRef;

public class MainFrame extends JFrame {
   private static final long serialVersionUID = -5570653778104813836L;
   private final JTextField address_;
   private final CefApp cefApp_;
   private final CefClient client_;
   private final CefBrowser browser_;
   private final Component browserUI_;
   private final CefBrowser browser_2;
   private final Component browserUI_2;

   private final ArrayList<HashMap<String, Object>> bindBrowsers = new ArrayList<HashMap<String, Object>>();
   private boolean browserFocus_ = true;

   public static void main(String[] args) {
      // Perform startup initialization on platforms that require it.
      if (!CefApp.startup(args)) {
         System.out.println("Startup initialization failed!");
         return;
      }

      // The simple example application is created as anonymous class and points
      // to Google as the very first loaded page. Windowed rendering mode is used by
      // default. If you want to test OSR mode set |useOsr| to true and recompile.
      boolean useOsr = false;
      new MainFrame("http://www.google.com", useOsr, false);
   }

   /**
    * To display a simple browser window, it suffices completely to create an
    * instance of the class CefBrowser and to assign its UI component to your
    * application (e.g. to your content pane).
    * But to be more verbose, this CTOR keeps an instance of each object on the
    * way to the browser UI.
    */
   private MainFrame(String startURL, boolean useOSR, boolean isTransparent) {
      CefApp.addAppHandler(new CefAppHandlerAdapter(null) {
         @Override
         public void stateHasChanged(org.cef.CefApp.CefAppState state) {
            // Shutdown the app if the native CEF part is terminated
            if (state == CefAppState.TERMINATED)
               System.exit(0);
         }
      });
      CefSettings settings = new CefSettings();
      settings.windowless_rendering_enabled = useOSR;
      cefApp_ = CefApp.getInstance(null, settings);
      client_ = cefApp_.createClient();

      browser_ = client_.createBrowser(startURL, useOSR, isTransparent);
      browserUI_ = browser_.getUIComponent();

      browser_2 = client_.createBrowser(startURL, useOSR, isTransparent);
      browserUI_2 = browser_2.getUIComponent();

      HashMap<String, Object> map = new HashMap<String, Object>();
      map.put("browser", browser_);
      map.put("seq", 0);
      bindBrowsers.add(map);
      map = new HashMap<String, Object>();
      map.put("browser", browser_2);
      map.put("seq", 1);
      bindBrowsers.add(map);

      address_ = new JTextField(startURL, 100);

      client_.addDisplayHandler(new CefDisplayHandlerAdapter() {
         @Override
         public void onAddressChange(CefBrowser browser, CefFrame frame, String url) {
            address_.setText(url);
         }
      });
      client_.addFocusHandler(new CefFocusHandlerAdapter() {
         @Override
         public void onGotFocus(CefBrowser browser) {
            System.out.println("onGotFocus");
         }

         @Override
         public boolean onSetFocus(final CefBrowser browser, FocusSource focusSource) {
            if (browser == null) {
               return false;
            }
            return true;
         }
      });
      client_.addKeyboardHandler(new CefKeyboardHandler() {
         @Override
         public boolean onKeyEvent(CefBrowser browser, CefKeyEvent event) {
            int browserSeq = 999;
            for (HashMap<String, Object> map : bindBrowsers) {
               if ((CefBrowser) map.get("browser") == browser) {
                  browserSeq = (int) map.get("seq");
               }
            }
            switch (event.character)
            {
               case 'q':
                  System.out.println("browser" + browserSeq + " : q pressed");
                  break;
               case 'Q':
                  System.out.println("browser" + browserSeq + " : Q pressed");
                  break;
               default:
                  break;
            }
            return false;
         }

         @Override
         public boolean onPreKeyEvent(CefBrowser arg0, CefKeyEvent arg1, BoolRef arg2) {
            return false;
         }
      });

      setLayout(null);
      setBounds(0, 0, 1200, 600);
      setVisible(true);

      address_.setBounds(0, 0, getContentPane().getWidth(), 30);
      getContentPane().add(address_);

      JPanel base = new JPanel();
      JPanel web1 = new JPanel();
      JPanel web2 = new JPanel();
      base.setLayout(null);
      web1.setLayout(null);
      web2.setLayout(null);

      base.setBounds(0, address_.getHeight(), getContentPane().getWidth(), getContentPane().getHeight() - address_.getHeight());
      base.setVisible(true);
      getContentPane().add(base);

      web1.setBounds(0, 0, base.getWidth() / 2, base.getHeight());
      web1.setBorder(new LineBorder(Color.red));
      web2.setBounds(web1.getWidth(), 0, base.getWidth() / 2, base.getHeight());
      web2.setBorder(new LineBorder(Color.blue));
      web1.setVisible(true);
      web2.setVisible(true);
      base.add(web1);
      base.add(web2);

      browserUI_.setBounds(1, 1, web1.getWidth() - 2, web1.getHeight() - 2);
      browserUI_2.setBounds(1, 1, web2.getWidth() - 2, web2.getHeight() - 2);
      web1.add(browserUI_);
      web2.add(browserUI_2);

      setFocusWeb1();

      addWindowListener(new WindowAdapter() {
         @Override
         public void windowClosing(WindowEvent e) {
            CefApp.getInstance().dispose();
            dispose();
         }
      });
   }

   private void setFocusWeb1() {
      browserUI_.requestFocus();
      //      browser_.setFocus(true); <-- also not woking
   }
}

Last edited by micrikit on Wed Sep 21, 2022 7:13 pm, edited 1 time in total.
micrikit
Techie
 
Posts: 14
Joined: Tue Jun 14, 2022 2:10 am

Re: Can't set focus on a browser with multiple browser.

Postby micrikit » Wed Sep 21, 2022 7:13 pm

Code: Select all
client_.addFocusHandler(new CefFocusHandlerAdapter() {
         @Override
         public void onGotFocus(CefBrowser browser) {
            System.out.println("onGotFocus");
         }

         @Override
         public boolean onSetFocus(final CefBrowser browser, FocusSource focusSource) {
            if (browser == null) {
               return false;
            }
            return true; <-- THIS
         }
      });


Obviously this causes...
micrikit
Techie
 
Posts: 14
Joined: Tue Jun 14, 2022 2:10 am

Re: 【SOLVED】Can't set focus on a browser with multiple brows

Postby micrikit » Wed Nov 23, 2022 8:56 pm

PS. this works fine.
Code: Select all
   private class CustomFocusHandlerAdapter extends CefFocusHandlerAdapter{

      private long focusTime = 0;

      @Override
      public void onGotFocus(CefBrowser arg0) {
         System.out.println("on got focus");
         focusTime = System.currentTimeMillis();
         super.onGotFocus(arg0);
      }

      @Override
      public boolean onSetFocus(CefBrowser arg0, FocusSource arg1) {
         long currentTime = System.currentTimeMillis();
         if (currentTime - focusTime < 100) {
            return true;
         }
         return false;
      }
   }
micrikit
Techie
 
Posts: 14
Joined: Tue Jun 14, 2022 2:10 am


Return to JCEF Forum

Who is online

Users browsing this forum: No registered users and 23 guests