From 0177804eccb47078cb1d2d16c9db34f5cc08c693 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 24 Dec 2024 19:43:18 +0800 Subject: [PATCH 1/3] =?UTF-8?q?REPORT-143738=20=E4=BD=BF=E7=94=A8jxbrowser?= =?UTF-8?q?=E7=9A=84JxUIPane=E7=BB=84=E4=BB=B6=E4=BC=98=E5=8C=96=E5=8D=A1?= =?UTF-8?q?=E9=A1=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/jxbrowser/JxUIPane.java | 133 +++++++++++++----- 1 file changed, 97 insertions(+), 36 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java b/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java index 1b479bd95c..e004de26c2 100644 --- a/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java @@ -23,16 +23,24 @@ import com.teamdev.jxbrowser.view.swing.BrowserView; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.JProgressBar; import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; import java.awt.BorderLayout; +import java.awt.Desktop; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.Consumer; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; import static com.fr.design.ui.ModernUIConstants.COMPONENT_TAG; import static com.fr.design.ui.ModernUIConstants.DEFAULT_EXPRESSION; import static com.fr.design.ui.ModernUIConstants.DEFAULT_NAMESPACE; @@ -61,33 +69,78 @@ public class JxUIPane extends BasicPane { */ public static final String COLON = ":"; private static final String COLON_ESCAPE = "\\:"; - private Browser browser; private String namespace = "Pool"; private String variable = "data"; private String expression = "update()"; - private JxEngine jxEngine = JxEngine.getInstance(); - - private JxUIPane() { - } + private final JxEngine jxEngine; + private Consumer initCallback = null; private JxUIPane(JxEngine jxEngine) { this.jxEngine = jxEngine; } - private void initialize() { + private void initialize(Consumer consumer) { setLayout(new BorderLayout()); if (browser != null) { return; } + hackInITInnovationLinuxDesktop(); + initCallback = consumer; initDebugIfNeeded(); - browser = jxEngine.getEngine().newBrowser(); - if (jxEngine.isDisableWebSecurity()) { - // 忽略证书验证,兼容有些情况下自定义证书与实际域名不匹配的情况。 - // 虽然不是个正确的方式,但真有这么用的还是兼容一下 - browser.set(CertificateErrorCallback.class, (params, action) -> action.allow()); + JProgressBar jProgressBar = showProgressBar(); + new SwingWorker() { + + @Override + protected Browser doInBackground() { + browser = jxEngine.getEngine().newBrowser(); + if (jxEngine.isDisableWebSecurity()) { + // 忽略证书验证,兼容有些情况下自定义证书与实际域名不匹配的情况。 + // 虽然不是个正确的方式,但真有这么用的还是兼容一下 + browser.set(CertificateErrorCallback.class, (params, action) -> action.allow()); + } + return browser; + } + + @Override + protected void done() { + jProgressBar.setVisible(false); + try { + Browser mBrowser = get(); + add(BrowserView.newInstance(mBrowser), BorderLayout.CENTER); + if (initCallback != null) { + initCallback.accept(mBrowser); + } + initCallback = null; + revalidate(); + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } + } + }.execute(); + } + + /** + * hack:部分 Linux 信创桌面打开需要先初始化 Desktop + */ + private static void hackInITInnovationLinuxDesktop() { + if (OperatingSystem.isLinux()) { + Desktop.getDesktop(); } - add(BrowserView.newInstance(browser), BorderLayout.CENTER); + } + + /** + * 加载组件时显示一个进度条 + */ + private @NotNull JProgressBar showProgressBar() { + JProgressBar jProgressBar = new JProgressBar(); + jProgressBar.setIndeterminate(true); + add(row( + flex(), + column(flex(), cell(jProgressBar), flex()), + flex() + ).getComponent(), BorderLayout.CENTER); + return jProgressBar; } /** @@ -97,8 +150,23 @@ public class JxUIPane extends BasicPane { * @param headers 自定义头 */ public void addXHRHeaders(Map headers) { - if (JxEngine.getInstance() != jxEngine) { - jxEngine.addXHRHeaders(headers); + warpCallback(browser -> { + if (JxEngine.getInstance() != jxEngine) { + jxEngine.addXHRHeaders(headers); + } + }); + } + + /** + * 异步链式调用 + * + * @param then 后续任务 + */ + private void warpCallback(Consumer then) { + if (initCallback != null) { + initCallback = initCallback.andThen(then); + } else { + then.accept(browser); } } @@ -161,7 +229,7 @@ public class JxUIPane extends BasicPane { * @param url 新的地址 */ public void redirect(String url) { - browser.navigation().loadUrl(encodeWindowsPath(url)); + warpCallback(browser -> browser.navigation().loadUrl(encodeWindowsPath(url))); } /** @@ -172,7 +240,7 @@ public class JxUIPane extends BasicPane { */ public void redirect(String url, Map map) { setMap(map); - browser.navigation().loadUrl(encodeWindowsPath(url)); + warpCallback(browser -> browser.navigation().loadUrl(encodeWindowsPath(url))); } private void setMap(Map map) { @@ -195,19 +263,11 @@ public class JxUIPane extends BasicPane { * @param t 数据类 */ public void populate(final T t) { - setInjectJsCallback(params -> { + warpCallback(browser -> setInjectJsCallback(params -> { executeJsObject(params.frame(), WINDOW + DOT + namespace) .ifPresent(ns -> ns.putProperty(variable, t)); return InjectJsCallback.Response.proceed(); - }); - if (browser.mainFrame().isPresent()) { - executeJavaScript(WINDOW + DOT + namespace, - (Consumer) jsObject -> { - if (Objects.nonNull(jsObject)) { - jsObject.putProperty(variable, t); - } - }); - } + })); } @Nullable @@ -573,16 +633,17 @@ public class JxUIPane extends BasicPane { pane.expression = expression; pane.setMap(parameterMap); pane.setComponent(component); - pane.initialize(); - injectJs(pane); - if (!Objects.isNull(listenerPair)) { - pane.browser.navigation().on(listenerPair.getFirst(), listenerPair.getSecond()); - } - if (StringUtils.isNotEmpty(this.url)) { - pane.browser.navigation().loadUrl(encodeWindowsPath(this.url)); - } else if (StringUtils.isNotEmpty(this.html)) { - pane.browser.mainFrame().ifPresent(f -> f.loadHtml(html)); - } + pane.initialize(browser -> { + injectJs(pane); + if (!Objects.isNull(listenerPair)) { + browser.navigation().on(listenerPair.getFirst(), listenerPair.getSecond()); + } + if (StringUtils.isNotEmpty(url)) { + browser.navigation().loadUrl(encodeWindowsPath(url)); + } else if (StringUtils.isNotEmpty(html)) { + browser.mainFrame().ifPresent(f -> f.loadHtml(html)); + } + }); return pane; } From aba0226ef476705634c0c9f12d9165163abde962 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 24 Dec 2024 19:49:07 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/jxbrowser/JxUIPane.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java b/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java index e004de26c2..79260b7838 100644 --- a/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java @@ -88,6 +88,13 @@ public class JxUIPane extends BasicPane { hackInITInnovationLinuxDesktop(); initCallback = consumer; initDebugIfNeeded(); + asyncInitBrowser(); + } + + /** + * 启动 jxbrowser 引擎,过程包含解压文件等过程,异步操作。 + */ + private void asyncInitBrowser() { JProgressBar jProgressBar = showProgressBar(); new SwingWorker() { From 43e4b6382339e81588766e0c4e736c958ad0b784 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 24 Dec 2024 19:58:13 +0800 Subject: [PATCH 3/3] REPORT-145158 [jsvg] Paths should be rendered up to the location of error --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d2d0d1506a..2bcebb1c7a 100644 --- a/build.gradle +++ b/build.gradle @@ -116,7 +116,7 @@ allprojects { implementation 'com.fr.report:engine-chart:' + frDevVersion implementation 'com.fr.report:engine-i18n:' + frDevVersion implementation 'com.fr.design:design-i18n:' + frDevVersion - implementation 'com.github.weisj:jsvg:1.2.0' + implementation 'com.github.weisj:jsvg:1.6.1' implementation 'com.formdev:flatlaf:3.4' implementation 'com.formdev:flatlaf-extras:3.4' implementation 'com.fine.swing.ui:layout:1.0-SNAPSHOT'