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