From 18c92584eeaa93079f28a8b2b00b73de4a11b641 Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 19 Oct 2021 15:28:44 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-60982=20=E4=B8=BB=E9=A2=98=E8=8E=B7?= =?UTF-8?q?=E5=8F=96-=E7=82=B9=E5=87=BB=E8=8E=B7=E5=8F=96=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E5=90=8E=E7=BD=91=E7=BB=9C=E8=BE=83=E6=85=A2=E6=97=B6?= =?UTF-8?q?=E8=BF=87=E6=B8=A1=E4=B8=8D=E5=90=88=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 修改主题下载交互 1. 添加加载动画 2. 下载是弹窗菜单不消失 【改动思路】 同上 --- .../actions/DownloadSuitableThemeAction.java | 31 ++++++++--- .../share/ui/actions/LoadingMenuItem.java | 50 ++++++++++++++++++ .../SharedComponentActionMenuItemUI.java | 37 ++++++++----- .../ui/block/AbstractOnlineWidgetBlock.java | 3 +- .../com/fr/design/form/images/loading.gif | Bin 0 -> 3430 bytes 5 files changed, 101 insertions(+), 20 deletions(-) create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/LoadingMenuItem.java create mode 100644 designer-form/src/main/resources/com/fr/design/form/images/loading.gif diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/DownloadSuitableThemeAction.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/DownloadSuitableThemeAction.java index 399a644b4..f8f4cc1a7 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/DownloadSuitableThemeAction.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/DownloadSuitableThemeAction.java @@ -10,6 +10,7 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIMenuItemUI; +import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.i18n.Toolkit; import com.fr.design.login.DesignerLoginHelper; import com.fr.design.login.DesignerLoginSource; @@ -39,22 +40,35 @@ import java.util.concurrent.ExecutionException; */ public class DownloadSuitableThemeAction extends UpdateAction { private final String themePath; + private final UIPopupMenu popupMenu; private boolean downloading = false; private JTemplate currentTemplate; - public DownloadSuitableThemeAction(String themePath) { + public DownloadSuitableThemeAction(String themePath, UIPopupMenu popupMenu) { this.themePath = themePath; + this.popupMenu = popupMenu; this.putValue(Action.SMALL_ICON, null); this.setName(Toolkit.i18nText("Fine-Design_Share_Download_Suitable_Theme")); } @Override public UIMenuItem createMenuItem() { - UIMenuItem menuItem = super.createMenuItem(); - menuItem.setOpaque(true); - menuItem.setBackground(ColorConstants.BACKGROUND); - menuItem.setUI(new SharedComponentActionMenuItemUI()); - return menuItem; + return getLoadingMenuItem(); + } + + public LoadingMenuItem getLoadingMenuItem() { + Object object = this.getValue(LoadingMenuItem.class.getName()); + if (object == null) { + UIMenuItem menuItem = new LoadingMenuItem(this); + // 设置名字用作单元测 + menuItem.setName(getName()); + setPressedIcon4Button(menuItem); + setDisabledIcon4Button(menuItem); + object = menuItem; + + this.putValue(LoadingMenuItem.class.getName(), object); + } + return (LoadingMenuItem) object; } @Override @@ -91,6 +105,8 @@ public class DownloadSuitableThemeAction extends UpdateAction { } downloading = true; + LoadingMenuItem menuItem = getLoadingMenuItem(); + menuItem.startLoading(); new SwingWorker() { @Override @@ -109,11 +125,14 @@ public class DownloadSuitableThemeAction extends UpdateAction { onThemeFetched(theme); downloading = false; + LoadingMenuItem menuItem = getLoadingMenuItem(); + menuItem.stopLoading(); } }.execute(); } public void onThemeFetched(FormTheme theme) { + popupMenu.menuSelectionChanged(false); if (theme == null) { return; } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/LoadingMenuItem.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/LoadingMenuItem.java new file mode 100644 index 000000000..6262c34a3 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/LoadingMenuItem.java @@ -0,0 +1,50 @@ +package com.fr.design.mainframe.share.ui.actions; + +import com.fr.design.gui.imenu.UIMenuItem; +import com.fr.design.mainframe.share.ui.constants.ColorConstants; +import com.fr.general.IOUtils; + +import javax.swing.Action; +import javax.swing.BorderFactory; +import javax.swing.Icon; +import java.awt.Graphics; + +/** + * @author Starryi + * @version 1.0 + * Created by Starryi on 2021/10/19 + */ +public class LoadingMenuItem extends UIMenuItem { + private boolean loading = false; + + private final Icon profileIcon = IOUtils.readIcon("/com/fr/design/form/images/loading.gif"); + + public LoadingMenuItem(Action action) { + super(action); + setOpaque(true); + setBackground(ColorConstants.BACKGROUND); + setUI(new SharedComponentActionMenuItemUI(false)); + } + + public void startLoading() { + loading = true; + setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); + revalidate(); + repaint(); + } + + public void stopLoading() { + loading = false; + setBorder(BorderFactory.createEmptyBorder()); + revalidate(); + repaint(); + } + + @Override + protected void paintBorder(Graphics g) { + super.paintBorder(g); + if (loading) { + profileIcon.paintIcon(this, g, getWidth() - 20, 0); + } + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentActionMenuItemUI.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentActionMenuItemUI.java index ca4d499b1..8a3fe5e1c 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentActionMenuItemUI.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentActionMenuItemUI.java @@ -8,7 +8,7 @@ import com.fr.stable.Constants; import javax.swing.ButtonModel; import javax.swing.JMenu; import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; +import javax.swing.MenuSelectionManager; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; @@ -20,6 +20,16 @@ import java.awt.Graphics2D; */ public class SharedComponentActionMenuItemUI extends UIMenuItemUI { + private final boolean autoClosePopup; + + public SharedComponentActionMenuItemUI(boolean autoClosePopup) { + this.autoClosePopup = autoClosePopup; + } + + public SharedComponentActionMenuItemUI() { + this(true); + } + @Override protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { ButtonModel model = menuItem.getModel(); @@ -27,18 +37,19 @@ public class SharedComponentActionMenuItemUI extends UIMenuItemUI { int menuWidth = menuItem.getWidth(); int menuHeight = menuItem.getHeight(); - g.setColor(UIConstants.NORMAL_BACKGROUND); - g.fillRect(0, 0, menuWidth, menuHeight); - if (menuItem.isOpaque()) { - if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) { - GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 7); - } else { - GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, menuItem.getBackground(), 7); - } - g.setColor(oldColor); - } else if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) { - GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 7); - g.setColor(oldColor); + if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) { + GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 0); + } + + g.setColor(oldColor); + } + + @Override + protected void doClick(MenuSelectionManager msm) { + if (autoClosePopup) { + super.doClick(msm); + } else { + menuItem.doClick(0); } } } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/AbstractOnlineWidgetBlock.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/AbstractOnlineWidgetBlock.java index 5ce5b57dd..3be4f96b9 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/AbstractOnlineWidgetBlock.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/AbstractOnlineWidgetBlock.java @@ -116,12 +116,13 @@ public abstract class AbstractOnlineWidgetBlock extends PreviewWidgetBlockhv}#+}aVEv=5L*BUxHZZtO8&!4|==FGXKX8W;Y$4}RvX=rR38XCQD z;nKy6mmH4kmoHzra^>2gLx=1wtu-~Z4Gm2l9bGM0)tnvY&YiEXKT}mzRa0B*aJKgk z3|_g~a0run>ot@n$>gvYsJschx8ydcQckIFF-TNb>_g=nyNq>e3aTC7y9QR`{h>bwGtl=1VmW(KVwN6J{rOJS!J z%hmY>iI7g60WHc@L2Fc^97dFk7FjATEh;Wj>y@<9qC!oHxKzqe=4i9kV(fWxnZ=;J zGSRP*GGZn_&?aNbwK_G87tUv@I3SxQ5QTI2Y>>wZqjA|B0gKIJvH46kN6Z$Axg6T- zi-ASc<>ZRf74ffQVQ*4KzFuD}X0g_V{t?x5sS@bak)&)f>~nF=#`~R zO-az39Te&km9C&zU!c{{CU;b3YuD%B@`8>r2Mh5rX>88pm3G8h*hdAW^uyV ztfHbxU9YT5^y%vVrZJ^;Nv5G#%}Q67XxHjgYRo+7jWbreKMyo%h-D*A)fHe+l!Xed zYHg8Pqfb&u8Q7QboPr#24o9TUX7fO1gpeJ<1S6CxrbxigW~v38ToF4L`(?A=>@$^r zjDj5#!4}2F2;zAhPF$=AjEfNpxpF>V7{`r|<-YMv(v;|x8kPD@>;f$IYu}hZ^%cu? zYNcMQ%hYNM-*iD*zE-a-$=4RsYR9;wutts z(&B1suLQf~gc{gG^8fikQj>zM2^!$c@P5ayi*tfq?PaKj;6gAPY;1HQ6rz z(>`yOu%4WJ{NpfSFMk{-wFWywI_$9EU;g`Fzy0$czfS!9Z!ezz^6cr8pMU!6;~#(c z{=09#`TDCzUyeU~aR1)e-O-WZp}{)?xBL5gdv4wAzR}g$alPH?Xlre;H#aplT)TSZ z@}-Lx&YwGbrvCJ)lXWMKAFHi7dgSn-g9rBS+xwU5FZS%-wR6YkRiAC&_UYCwHf!bP zO%)qAlv~WEPs%<<5!eVBO4qMjt1r=gRIJq$6|Pxbke`>U&QWD6SAF=w$`$V~&sw(h zy(O6$>5J1+7o{vrUXYZS5Fe+I$HqiQ$)u4Iu}CQ3^S}r$hs_FShK0WS&is(zd2@pp zbQ*O|;Otp5-+n8=-_O^_+Y6w0&hQ{lpXN?-b0xYEu#rRmmFSAYeT)mkrVsYF0N`+> zkuubTpoqa;JIi9SqA+C+)i2c3hyd?aZpjdOh8qGt2gM*_K`6qow(8>P0t1N>Xfyk-r7`K)EWd+*U5YQ#}ep1G08} zjYM%G{m~$VB;R8)_M1V*F5$E@`SJ>q?5C<{KJ6}6dUWxV?|+$Bw%IlLc-7hZ{jH<` z|1giT=$2UbS(N9(F1ZWdHHy(O;iYoAQDxSN*}c!`7IzW4+CEWst{RjDT6_;4NKd0p zrFH;Qi^9<=$Pg=o&1M*;$N7*@b+Ez9YD!66XNd6$q_`!A#Vv;rOYHo7<+1t(Y+z%pC8}P;JFAgu3!&G-oVT`lBwg^yucEZN#{I zg~+7B*=VA-=0A>DRY}F;K#vw(8O076{BiXMLb?J|UQ7_b|MZ6rLb(a!ItA9D-?4hd z7NT&u$p#Cu#B|?K6byF7vNXs;l?LBZWRYhy-K$*4_mk#H-Y*pUWQFkXCRGs!jHRMR zAWO*6djbgQy?|so(u0Jop01Z-Wq_$3mMxSeP>4aqU`VYt)F2B8NSEnyWX5}DWTmI4 z-t@LS{)H|7@kmBKg@O}38+eo<--wG}++KI=X|z2;$``uRbccG)E(VP|T}N}DK?Wus zAEVb!qe@-G6Iu4Qt)4T$y+voA5=r}9qsy4}_%y&48@0}NVSxKoS_fZ2rKVaIh%lyD ziqc>JEyBS&Z3QAP5;vN(P#Pji!iY-Ki=kCZ62bw_yh0S&0%y*U5O_v_QZg-wZXhK9 zkOY7)8hC;6g2f_^4z~`hv>_{fJeQ+{sHI?y4N7A~&8{JkAgeiYrqPSKBrcKnjR}V4 zxdo@Ww?4wpz#F??jGV(IY;?oz8Bf!-t*``X?3wOoYI|(6$*r7FAwF{aAMaR zHY121CvUmrCX5Jx&AUk))X(5SCQ~ZS@B*cBtt2{nCN#2pQFy>|Gidw@iI2Lt2_hx9 zgPo2qH@OhK*_`^~RjIc1FfptJuObA_Leriec=|ATJCW=$SLt z^k+GvB@dJ51o-?md)F#AqUb~PSz^-oMv6r`GIjs*fa3uW_2%t@L4S}RDG^Bg zsSw69DL8_S8XN9d5lAE@Jv2J4W;_L|CMguVY*5h(ZZePWl<;?2jB|!@+lkW-0C8gz zz_$shpK@bkzbg1LWGh9mf_ORF#X=^s)YWrux2hd@7n#3sep<_B-(ru{3HB3Z>NIwS zBkPOL^UADJuMXk3JaOu2bO#e@Mko>t=4J$p0%2+-iecJhF_L4DZ3tN=fOi@pnD0;6 zKwuOYjDQJH5Fio{g}|jeQrx0TkX+2)X);iKWn#o|(`a;7@Tq79oD~pW$m*-`Ps|OR zmlf~lFTqq<+eOzCq_SX^QuILqpWI{i@xG`jI$l*GtK(Ev*nS) z&pW$npl|%Zf^wGv;Y6p8X#*)3wXb;cnZx->q?cRVMB0Xga(3u%j@@2CTNx_=zM}r1 zlS0KC-CPM%_3iL0oJPI{05F``5aB6|C{>K?wCS>7l*ltmK7xf&X2U9GAxa{|ON@Xh z!35LkwK5n&jXaSAg^@@$-k2CuZGlLQ6q0hTn_5n{R&p3J4yst9l6P6DQGCb?rEtJX z>j`fNiOchuPcjUlv8w#Y#A!=3k?hvIwzIS1O?G_i#-2@c)K$+%oMA0{5-KMuc7Jvx zeixo