From b8e4fdb55a38ce5094c2afbcd0d3189522f695d8 Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Sun, 10 Oct 2021 18:03:17 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-60637=20=E5=BC=95=E5=AF=BC=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/guide/base/Guide.java | 46 +++++++++++----- .../mainframe/guide/base/GuideView.java | 19 +++++++ .../guide/ui/GuideLoadingGlassPane.java | 52 ++++++++++++++++++ .../design/mainframe/guide/ui/ImagePanel.java | 28 ++++++++++ .../com/fr/design/mainframe/guide/loading.gif | Bin 0 -> 14014 bytes .../layout/UseLayoutAndComponentGuide.java | 10 +++- .../theme/DownloadComponentPackageGuide.java | 7 ++- 7 files changed, 143 insertions(+), 19 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/guide/ui/ImagePanel.java create mode 100644 designer-base/src/main/resources/com/fr/design/mainframe/guide/loading.gif diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java index e35ee4a48..7f34950ad 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java @@ -7,6 +7,7 @@ import com.fr.design.mainframe.guide.ui.GuideManageDialog; import com.fr.stable.StringUtils; import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; public class Guide { public enum GuideState { @@ -109,24 +110,41 @@ public class Guide { return; } GuideManager.getInstance().setCurrentGuide(this); - try { - if (lifecycle != null && !lifecycle.prepared()) { - return; - } - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - start(); + guideView.showLoading(); + + new SwingWorker() { + @Override + protected Boolean doInBackground() { + try { + if (lifecycle != null && !lifecycle.prepared()) { + return false; + } + return true; + } catch (Exception e) { + e.printStackTrace(); + guideView.hideLoading(); + terminate(); + return false; } - }); - } catch (Exception e) { - e.printStackTrace(); - end(); - } + } + @Override + protected void done() { + try { + if (get()) { + start(); + } + } catch (Exception e) { + e.printStackTrace(); + guideView.hideLoading(); + terminate(); + } + } + }.execute(); } public void start() { + guideView.hideLoading(); if (scene != null) { guideView.setScene(scene); guideView.showGuide(); @@ -136,7 +154,6 @@ public class Guide { } else { complete(); } - } public void complete() { @@ -159,7 +176,6 @@ public class Guide { public void end() { guideView.dismissGuide(); - SwingUtilities.invokeLater(new Runnable() { @Override public void run() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java index 1f0a07ad1..53e18ffd7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java @@ -4,8 +4,10 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.guide.scene.AbstractGuideScene; import com.fr.design.mainframe.guide.scene.GuideScene; +import com.fr.design.mainframe.guide.ui.GuideLoadingGlassPane; import javax.swing.JDialog; +import javax.swing.SwingUtilities; import java.awt.Color; import java.awt.Graphics; import java.awt.Window; @@ -40,6 +42,7 @@ public class GuideView extends JDialog { this.setSize(window.getSize()); this.setLayout(FRGUIPaneFactory.createBorderLayout()); setBg(); + this.setGlassPane(new GuideLoadingGlassPane()); } private WindowFocusListener windowFocusListener = new WindowFocusListener() { @@ -122,4 +125,20 @@ public class GuideView extends JDialog { public void paint(Graphics g) { super.paint(g); } + + public void showLoading() { + this.setVisible(true); + this.getGlassPane().setVisible(true); + } + + public void hideLoading() { + this.getGlassPane().setVisible(false); + repaint(); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + setVisible(false); + } + }); + } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java new file mode 100644 index 000000000..6b6273c22 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java @@ -0,0 +1,52 @@ +package com.fr.design.mainframe.guide.ui; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; + +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; + +public class GuideLoadingGlassPane extends JPanel { + private static final String loadingImagePath = "/com/fr/design/mainframe/guide/loading.gif"; + private static GuideLoadingGlassPane loadingPane; + + public static GuideLoadingGlassPane getInstance() { + if (loadingPane == null) { + loadingPane = new GuideLoadingGlassPane(); + } + return loadingPane; + } + + public GuideLoadingGlassPane() { + this.setLayout(new GridBagLayout()); + this.setOpaque(false); + initComponent(); + } + + public void initComponent() { + JPanel loadingView = FRGUIPaneFactory.createBorderLayout_S_Pane(); + loadingView.setOpaque(false); + loadingView.setPreferredSize(new Dimension(130, 120)); + + JPanel imageContainer = FRGUIPaneFactory.createCenterFlowInnerContainer_S_Pane(); + imageContainer.setOpaque(false); + ImagePanel imagePanel = new ImagePanel(loadingImagePath); + imagePanel.setOpaque(false); + imagePanel.setPreferredSize(new Dimension(84, 84)); + imageContainer.add(imagePanel); + + UILabel hintLabel = new UILabel("任务加载中,请稍后..."); + hintLabel.setHorizontalAlignment(SwingConstants.CENTER); + hintLabel.setForeground(Color.WHITE); + + loadingView.add(imageContainer, BorderLayout.NORTH); + loadingView.add(hintLabel, BorderLayout.SOUTH); + + this.add(loadingView, new GridBagConstraints()); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/ImagePanel.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/ImagePanel.java new file mode 100644 index 000000000..deaf97417 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/ImagePanel.java @@ -0,0 +1,28 @@ +package com.fr.design.mainframe.guide.ui; + +import javax.swing.JPanel; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.Toolkit; + +/** + * Created by kerry on 2020-10-23 + */ +public class ImagePanel extends JPanel { + + + private Image image; + + public ImagePanel(String imagePath) { + image = Toolkit.getDefaultToolkit().createImage(ImagePanel.class + .getResource(imagePath)); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + if (image != null) { + g.drawImage(image, 0, 0, getWidth(), getHeight(), this); + } + } +} diff --git a/designer-base/src/main/resources/com/fr/design/mainframe/guide/loading.gif b/designer-base/src/main/resources/com/fr/design/mainframe/guide/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..90d13277afcb4005c553a90c863bc84f7a7c3b37 GIT binary patch literal 14014 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%0D3x`b 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