From c8bb1cae57ff091420df8dd45643682b1b6dfa2c Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 4 Apr 2023 13:50:05 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-92161=20=E8=AE=BE=E8=AE=A1=E5=99=A8-?= =?UTF-8?q?=E5=9B=BE=E6=A0=87-=E6=95=B0=E6=8D=AE=E6=BA=90=E7=9B=B8?= =?UTF-8?q?=E5=85=B3-=E9=83=A8=E5=88=86=E5=9B=BE=E6=A0=87=E6=97=A0?= =?UTF-8?q?=E5=8F=8D=E8=89=B2=E5=A4=84=E7=90=86=EF=BC=8C=E9=80=89=E4=B8=AD?= =?UTF-8?q?=E5=90=8E=E5=B0=B1=E7=9C=8B=E4=B8=8D=E5=88=B0=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/controlpane/JListControlPane.java | 9 ++- .../com/fr/design/utils/IconColorUtils.java | 66 +++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java index ee05422ca..7a1fcd9a4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java @@ -7,6 +7,7 @@ import com.fr.design.gui.ilist.JNameEdList; import com.fr.design.gui.ilist.ListModelElement; import com.fr.design.gui.ilist.ModNameActionListener; import com.fr.design.i18n.Toolkit; +import com.fr.design.utils.IconColorUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.event.Listener; import com.fr.general.ComparatorUtils; @@ -19,6 +20,7 @@ import com.fr.stable.core.PropertyChangeAdapter; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; +import javax.swing.Icon; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JPopupMenu; @@ -27,6 +29,7 @@ import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Component; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -357,7 +360,11 @@ public abstract class JListControlPane extends JControlPane implements ListContr boolean iconSet = false; for (NameableCreator creator : JListControlPane.this.creators()) { if (creator.menuIcon() != null && creator.acceptObject2Populate(nameable) != null) { - this.setIcon(creator.menuIcon()); + Icon icon = creator.menuIcon(); + if(isSelected) { + icon = IconColorUtils.convert(icon, Color.WHITE); + } + this.setIcon(icon); this.setToolTipText(creator.createTooltip()); iconSet = true; break; diff --git a/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java b/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java new file mode 100644 index 000000000..d8db0a6e1 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java @@ -0,0 +1,66 @@ +package com.fr.design.utils; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.image.BufferedImage; + + +/** + * 对Icon进行颜色处理的工具类 + * + * @author obo + * @since 11.0 + * Created on 2023/4/3 + */ +public final class IconColorUtils { + + /** + * 转色处理并返回处理后的Icon + * + * @param icon 需要转色处理的icon + * @param color 需要转的颜色,可能要和视觉沟通 + * @return 转色后的icon + */ + public static Icon convert(Icon icon, Color color) { + BufferedImage image = iconToImage(icon); + Image convertedImage = createConvertedImage(image, color); + return new ImageIcon(convertedImage); + } + + /** + * 获取icon中的image对象,虽然设计器中未来大部分图标会读取为SVGIcon类型,其中直接包含image对象 + * 但存在某些特殊情况,例如绘制带警告图标的数据集时,无法直接获取image对象,因此统一使用此方法获取 + * + * @param icon 需要获取image的icon + * @return 获取icon对应的image + */ + private static BufferedImage iconToImage(Icon icon) { + BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = image.createGraphics(); + icon.paintIcon(null, g2d, 0, 0); + g2d.dispose(); + return image; + } + + /** + * 转色 + * + * @param image 需要转色的image + * @return 转色后的image + */ + private static Image createConvertedImage(BufferedImage image, Color color) { + int colorRgb = (color.getRGB() & 0x00FFFFFF); + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + int originalArgb = image.getRGB(x, y); + int alpha = (originalArgb >> 24) & 0xFF; + int newArgb = (alpha << 24) | colorRgb; + image.setRGB(x, y, newArgb); + } + } + return image; + } +} \ No newline at end of file