From d956e697d5dc0f6c5581b83323207a08cffeb370 Mon Sep 17 00:00:00 2001 From: lemon Date: Tue, 24 Sep 2024 14:02:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20FineDayLabelUI=20=E6=8A=BD=E7=A6=BB?= =?UTF-8?q?=EF=BC=8C=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/light/ui/FineCalendarPaneUI.java | 103 +------------ .../fine/theme/light/ui/FineDayLabelUI.java | 140 ++++++++++++++++++ .../design/gui/date/CalendarNumberField.java | 3 +- .../com/fr/design/gui/date/UIDayLabel.java | 9 +- .../theme/light/ui/laf/FineLaf.properties | 1 + 5 files changed, 150 insertions(+), 106 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineDayLabelUI.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineCalendarPaneUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineCalendarPaneUI.java index f09d612699..17cb012f04 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineCalendarPaneUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineCalendarPaneUI.java @@ -1,9 +1,7 @@ package com.fine.theme.light.ui; -import com.formdev.flatlaf.ui.FlatRoundBorder; import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.design.gui.date.UICalendarPanel; -import com.fr.design.gui.date.UIDayLabel; import javax.swing.JComponent; import javax.swing.UIManager; @@ -11,26 +9,17 @@ import javax.swing.border.LineBorder; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.PanelUI; import java.awt.Color; -import java.awt.Component; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; /** * {@link UICalendarPanel} 的 UI 样式 + * * @author lemon * @since 12.0 * Created on 2024/09/22 */ public class FineCalendarPaneUI extends PanelUI { protected Color defaultBackground; - protected Color selectedBackground; - protected Color hoverBackground; - protected Color pressedBackground; - protected Color otherMonthForeground; - - protected int arc; /** * @param shared @@ -51,19 +40,11 @@ public class FineCalendarPaneUI extends PanelUI { } /** - * * @param c the component where this UI delegate is being installed - * */ public void installUI(JComponent c) { super.installUI(c); - selectedBackground = UIManager.getColor("Calendar.day.selectedBackground"); - hoverBackground = UIManager.getColor("Calendar.day.hoverBackground"); - pressedBackground = UIManager.getColor("Calendar.day.pressedBackground"); defaultBackground = UIManager.getColor("Calendar.background"); - otherMonthForeground = UIManager.getColor("Calendar.dayOtherMonth.foreground"); - - arc = UIManager.getInt("Calendar.day.arc"); //renderer this c.setBackground(defaultBackground); @@ -75,86 +56,4 @@ public class FineCalendarPaneUI extends PanelUI { super.uninstallUI(c); } - /** - * UICalendarPanel paint, 目前只对 {@link UIDayLabel} 样式自定义,其余使用默认样式 - * @param g the Graphics context in which to paint - * @param c the component being painted; - * this argument is often ignored, - * but might be used if the UI object is stateless - * and shared by multiple components - * - */ - public void paint(Graphics g, JComponent c) { - if (c instanceof UICalendarPanel) { - UICalendarPanel calendar = (UICalendarPanel) c; - paintComponent(calendar); - } - } - - private void paintComponent(JComponent component) { - if (component instanceof UIDayLabel) { - paintDayLabel((UIDayLabel) component); - return; - } - for (Component c : component.getComponents()) { - paintComponent((JComponent) c); - } - } - - private void paintDayLabel(UIDayLabel label) { - if (!label.isSmallLabel()) { - return; - } - - label.setBorder(new DayLabelRoundedBorder()); - - if (!label.isCurrentMonth()) { - label.setForeground(otherMonthForeground); - } - } - - private Color getBackgroundColor(UIDayLabel dayLabel) { - if (dayLabel.isSelected()) { - return selectedBackground; - } - if (dayLabel.isHovered()) { - return hoverBackground; - } - if (dayLabel.isPressed()) { - return pressedBackground; - } - return defaultBackground; - } - - /** - * {@link UIDayLabel} 的 border 样式 - */ - private class DayLabelRoundedBorder extends FlatRoundBorder { - - public DayLabelRoundedBorder() { - } - - @Override - public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { - Graphics2D g2 = (Graphics2D)g.create(); - - try { - FlatUIUtils.setRenderingHints(g2); - g2.setColor(getBackgroundColor((UIDayLabel) c)); - g2.fillRoundRect(0, 0, width , height, arc, arc); - - // 避免文字被背景色覆盖 - UIDayLabel dayLabel = (UIDayLabel) c; - g2.setColor(dayLabel.getForeground()); - FontMetrics metrics = g2.getFontMetrics(dayLabel.getFont()); - int x1 = (width - metrics.stringWidth(dayLabel.getText())) / 2; - int y1 = ((height - metrics.getHeight()) / 2) + metrics.getAscent(); - g2.drawString(dayLabel.getText(), x1, y1); - } finally { - g2.dispose(); - } - } - - } - } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineDayLabelUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineDayLabelUI.java new file mode 100644 index 0000000000..0018afd292 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineDayLabelUI.java @@ -0,0 +1,140 @@ +package com.fine.theme.light.ui; + +import com.formdev.flatlaf.ui.FlatLabelUI; +import com.formdev.flatlaf.ui.FlatRoundBorder; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.fr.design.gui.date.UIDayLabel; + +import javax.swing.JComponent; +import javax.swing.UIManager; +import javax.swing.plaf.ComponentUI; +import java.awt.Color; +import java.awt.Component; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; + +/** + * {@link UIDayLabel} 的 UI 样式 + * + * @author lemon + * @since 12.0 + * Created on 2024/09/22 + */ +public class FineDayLabelUI extends FlatLabelUI { + protected Color defaultBackground; + protected Color selectedBackground; + protected Color hoverBackground; + protected Color pressedBackground; + protected Color otherMonthForeground; + + protected int arc; + + /** + * @since 2 + */ + protected FineDayLabelUI() { + super(false); + } + + /** + * 创建UI + * + * @param c 组件 + * @return ComponentUI + */ + public static ComponentUI createUI(JComponent c) { + return FlatUIUtils.createSharedUI(FineDayLabelUI.class, FineDayLabelUI::new); + } + + /** + * @param c the component where this UI delegate is being installed + */ + public void installUI(JComponent c) { + super.installUI(c); + selectedBackground = UIManager.getColor("Calendar.day.selectedBackground"); + hoverBackground = UIManager.getColor("Calendar.day.hoverBackground"); + pressedBackground = UIManager.getColor("Calendar.day.pressedBackground"); + defaultBackground = UIManager.getColor("Calendar.background"); + otherMonthForeground = UIManager.getColor("Calendar.dayOtherMonth.foreground"); + + arc = UIManager.getInt("Calendar.day.arc"); + } + + @Override + public void uninstallUI(JComponent c) { + super.uninstallUI(c); + } + + /** + * UICalendarPanel paint, 目前只对 {@link UIDayLabel} 样式自定义,其余使用默认样式 + * + * @param g the Graphics context in which to paint + * @param c the component being painted; + * this argument is often ignored, + * but might be used if the UI object is stateless + * and shared by multiple components + */ + public void paint(Graphics g, JComponent c) { + super.paint(g, c); + if (c instanceof UIDayLabel) { + paintDayLabel((UIDayLabel) c); + } + } + + private void paintDayLabel(UIDayLabel label) { + if (!label.isSmallLabel()) { + label.setBackground(getBackgroundColor(label)); + return; + } + + label.setBorder(new DayLabelRoundedBorder()); + + if (!label.isCurrentMonth()) { + label.setForeground(otherMonthForeground); + } + } + + private Color getBackgroundColor(UIDayLabel dayLabel) { + if (dayLabel.isSelected()) { + return selectedBackground; + } + if (dayLabel.isHovered()) { + return hoverBackground; + } + if (dayLabel.isPressed()) { + return pressedBackground; + } + return defaultBackground; + } + + /** + * {@link UIDayLabel} 的 border 样式 + */ + private class DayLabelRoundedBorder extends FlatRoundBorder { + + public DayLabelRoundedBorder() { + } + + @Override + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + Graphics2D g2 = (Graphics2D) g.create(); + + try { + FlatUIUtils.setRenderingHints(g2); + g2.setColor(getBackgroundColor((UIDayLabel) c)); + g2.fillRoundRect(0, 0, width, height, arc, arc); + + // 避免文字被背景色覆盖 + UIDayLabel dayLabel = (UIDayLabel) c; + g2.setColor(dayLabel.getForeground()); + FontMetrics metrics = g2.getFontMetrics(dayLabel.getFont()); + int x1 = (width - metrics.stringWidth(dayLabel.getText())) / 2; + int y1 = ((height - metrics.getHeight()) / 2) + metrics.getAscent(); + g2.drawString(dayLabel.getText(), x1, y1); + } finally { + g2.dispose(); + } + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/date/CalendarNumberField.java b/designer-base/src/main/java/com/fr/design/gui/date/CalendarNumberField.java index 8b96c79db6..b965f2929a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/date/CalendarNumberField.java +++ b/designer-base/src/main/java/com/fr/design/gui/date/CalendarNumberField.java @@ -13,7 +13,6 @@ import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import static com.fine.theme.utils.FineUIScale.createScaleDimension; -import static com.fine.theme.utils.FineUIScale.scale; /** * Created with IntelliJ IDEA. @@ -22,7 +21,7 @@ import static com.fine.theme.utils.FineUIScale.scale; * Time: 上午11:06 * To change this template use File | Settings | File Templates. */ -public class CalendarNumberField extends UINumberField { +class CalendarNumberField extends UINumberField { private static final int NUM_TEN = 10; diff --git a/designer-base/src/main/java/com/fr/design/gui/date/UIDayLabel.java b/designer-base/src/main/java/com/fr/design/gui/date/UIDayLabel.java index 819bb1c270..794b9f3cd0 100644 --- a/designer-base/src/main/java/com/fr/design/gui/date/UIDayLabel.java +++ b/designer-base/src/main/java/com/fr/design/gui/date/UIDayLabel.java @@ -1,20 +1,20 @@ package com.fr.design.gui.date; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.utils.DesignUtils; import java.text.SimpleDateFormat; import java.util.Date; -import static com.fine.theme.utils.FineUIScale.scale; /** * 日期控件,day label + * * @author lemon * @since 12.0 * Created on 2024/09/22 */ public class UIDayLabel extends UILabel { + private static final String UI_CLASS_ID = "DayLabelUI"; private Date date = null; private int index; @@ -103,4 +103,9 @@ public class UIDayLabel extends UILabel { return this.index; } + @Override + public String getUIClassID() { + return UI_CLASS_ID; + } + } \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties index 86799ed9f2..0f74d6f6fb 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties @@ -8,6 +8,7 @@ ComboBoxUI=com.fine.theme.light.ui.FineComboBoxUI DesktopIconUI=com.formdev.flatlaf.ui.FlatDesktopIconUI DesktopPaneUI=com.formdev.flatlaf.ui.FlatDesktopPaneUI CalendarPaneUI=com.fine.theme.light.ui.FineCalendarPaneUI +DayLabelUI=com.fine.theme.light.ui.FineDayLabelUI EditorPaneUI=com.formdev.flatlaf.ui.FlatEditorPaneUI FileChooserUI=com.formdev.flatlaf.ui.FlatFileChooserUI FormattedTextFieldUI=com.formdev.flatlaf.ui.FlatFormattedTextFieldUI