我有一个带有 jCEF browser 的 JPanel,地址的 JTextfield 和 go 按钮有效,但浏览器本身不呈现。
这是代码
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.CefLoadHandlerAdapter;
import org.json.JSONException;
import org.json.JSONObject;
import javafx.application.Platform;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ChromePane extends SwingPane{
private boolean useOSR_;
private String startURL_;
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 browerUI_;
private boolean browserFocus_ = true;
private final JPanel panel_;
private JComponent JCompOut_;
private final JButton btnVai_;
public ChromePane(JSONObject json) throws JSONException {
super(json);
startURL_ = this.jsonobj.getString("url");
address_ = new JTextField(startURL_, 100);
panel_ = new JPanel(new BorderLayout());
CefSettings settings = new CefSettings();
settings.windowless_rendering_enabled = useOSR_;
cefApp_ = CefApp.getInstance(settings);
client_ = cefApp_.createClient();
useOSR_ = false;
boolean isTransparent = false;
browser_ = client_.createBrowser(startURL_, useOSR_, isTransparent);
browerUI_ = browser_.getUIComponent();
browerUI_.setVisible(true);
address_.setVisible(true);
//browerUI_.setSize(800, 600);
panel_.setVisible(true);
btnVai_ = new JButton("Go");
btnVai_.setBackground(Color.YELLOW);
panel_.add(address_, BorderLayout.NORTH);
panel_.setBackground(Color.GREEN);
panel_.add(browerUI_, BorderLayout.CENTER);
panel_.add(btnVai_, BorderLayout.SOUTH);//OK
address_.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
browser_.loadURL(address_.getText());
}
});
// Update the address field when the browser URL changes.
client_.addDisplayHandler(new CefDisplayHandlerAdapter() {
@Override
public void onAddressChange(CefBrowser browser, CefFrame frame, String url) {
address_.setText(url);
}
});
// Clear focus from the browser when the address field gains focus.
address_.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
if (!browserFocus_) return;
browserFocus_ = false;
KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
address_.requestFocus();
}
});
// Clear focus from the address field when the browser gains focus.
client_.addFocusHandler(new CefFocusHandlerAdapter() {
@Override
public void onGotFocus(CefBrowser browser) {
if (browserFocus_) return;
browserFocus_ = true;
KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
browser.setFocus(true);
}
@Override
public void onTakeFocus(CefBrowser browser, boolean next) {
browserFocus_ = false;
}
});
btnVai_.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
browser_.loadURL(address_.getText());
System.out.println("evento intercettato");
}});
// here cefState is INITIALIZED
System.out.println("stato cef: "+CefApp.getState());
}
public JComponent getComponent() {
return (JComponent) this.panel_;
}
}
注意:SwingPane 很好(我向它添加了“普通”Java 组件,例如 JButtons 和 JLabels,并且它可以正常工作)
我在 windows10 上使用 java11