Skip to content

Commit

Permalink
Add getInstance and simple tabbed browser example
Browse files Browse the repository at this point in the history
  • Loading branch information
Benjamin Faal committed Jan 10, 2021
1 parent 8b64c90 commit 162a073
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 4 deletions.
10 changes: 10 additions & 0 deletions src/main/java/com/benjaminfaal/jcef/loader/JCefLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ public class JCefLoader {

private static boolean loaded;

public static CefApp getInstance() {
if (!loaded) {
throw new IllegalStateException("JCEF is not loaded yet, use installAndLoad to load and create an instance");
}
return CefApp.getInstance();
}

/**
* Installs the default JCEF version to the destination and loads a {@link CefApp}.
*
Expand All @@ -45,6 +52,9 @@ public static CefApp installAndLoad(Path destination, CefSettings settings, Stri
* @return a {@link CefApp} loaded from the destination directory
*/
public static CefApp installAndLoad(String version, Path destination, CefSettings settings, String... args) throws IOException {
if (loaded) {
return CefApp.getInstance();
}
if (Files.exists(destination) && !Files.isDirectory(destination)) {
throw new IllegalArgumentException("Destination: " + destination + " must be a directory");
}
Expand Down
100 changes: 96 additions & 4 deletions src/test/java/JCefLoaderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,31 @@
import org.cef.CefClient;
import org.cef.CefSettings;
import org.cef.browser.CefBrowser;
import org.cef.browser.CefFrame;
import org.cef.handler.CefDisplayHandlerAdapter;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class JCefLoaderTest {

private static final JFrame frame = new JFrame("jcef-loader");

private static final JTabbedPane tabs = new JTabbedPane();

private static final JTextField urlTextField = new JTextField();

private static final List<CefBrowser> browsers = new ArrayList<>();

public static void main(String[] args) throws Exception {
Path jcefPath = Paths.get(System.getProperty("user.home")).resolve("jcef");
CefSettings settings = new CefSettings();
Expand All @@ -22,11 +37,60 @@ public static void main(String[] args) throws Exception {
settings.locale = Locale.getDefault().toString();
// Pass options to chromium for example to enable camera/microphone
CefApp app = JCefLoader.installAndLoad(jcefPath, settings, "--enable-media-stream");
CefClient client = app.createClient();
CefBrowser browser = client.createBrowser("https://google.com", false, false);

JFrame frame = new JFrame("jcef-loader");
frame.add(browser.getUIComponent());
addTab("https://google.com");
addTab("https://github.com/BenjaminFaal/jcef-loader");

JButton createTabButton = new JButton("+");
createTabButton.addActionListener(e -> addTab("https://google.com"));
frame.add(createTabButton, BorderLayout.LINE_END);

urlTextField.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
urlTextField.selectAll();
}
}
});
urlTextField.addActionListener(e -> {
int selectedIndex = tabs.getSelectedIndex();
if (selectedIndex != -1) {
CefBrowser browser = browsers.get(selectedIndex);
browser.loadURL(urlTextField.getText());
} else {
addTab(urlTextField.getText());
}
});
frame.add(urlTextField, BorderLayout.NORTH);
tabs.addChangeListener(e -> {
int selectedIndex = tabs.getSelectedIndex();
if (selectedIndex != -1) {
CefBrowser browser = browsers.get(selectedIndex);
urlTextField.setText(browser.getURL());
frame.setTitle(tabs.getTitleAt(selectedIndex) + " - jcef-loader");
} else {
urlTextField.setText(null);
frame.setTitle("jcef-loader");
}
});

tabs.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int index = tabs.indexAtLocation(e.getX(), e.getY());
if (index != -1) {
if (e.getButton() == MouseEvent.BUTTON2) {
CefBrowser browser = browsers.get(index);
browser.getClient().dispose();
browsers.remove(browser);
tabs.removeTabAt(index);
}
}
}
});
frame.add(tabs, BorderLayout.CENTER);

frame.setSize(800, 800);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
Expand All @@ -40,4 +104,32 @@ public void windowClosing(WindowEvent e) {
});
}

private static void addTab(String url) {
CefClient client = JCefLoader.getInstance().createClient();
CefBrowser browser = client.createBrowser(url, false, false);
browsers.add(browser);
Component component = browser.getUIComponent();
tabs.addTab(url, component);

int index = tabs.indexOfComponent(component);
client.addDisplayHandler(new CefDisplayHandlerAdapter() {
@Override
public void onTitleChange(CefBrowser browser, String title) {
if (index != -1) {
tabs.setTitleAt(index, title);
frame.setTitle(title + " - jcef-loader");
}
}

@Override
public void onAddressChange(CefBrowser browser, CefFrame frame, String url) {
int index = tabs.indexOfComponent(component);
if (index == tabs.getSelectedIndex()) {
urlTextField.setText(url);
}
}
});
tabs.setSelectedComponent(component);
}

}

0 comments on commit 162a073

Please sign in to comment.