JCef 浏览器未加载

时间:2021-03-19 13:06:02

标签: java chromium-embedded

我有一个带有 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

0 个答案:

没有答案