Browse Source

Pull request #14888: REPORT-134742 & REPORT-135139 fix: 日期控件翻新,动态 tab 页标题宽度调整

Merge in DESIGN/design from ~ZONGYU.WANG/design:fbp/release to fbp/release

* commit 'd956e697d5dc0f6c5581b83323207a08cffeb370':
  fix: FineDayLabelUI 抽离,代码质量调整
  fix: 去掉不用的代码
  fix: CalendarUI 和 ButtonUI 解耦,增加 storybook
  fix:调整注释
  REPORT-134742 fix: 修改编码质量
  REPORT-134742 fix: 使用缩放工具类
  REPORT-134742 fix: 日期控件 southPane 组件替换,day label UI 调整
  REPORT-134742 & REPORT-135139 fix: 日期控件翻新,动态 tab 页标题宽度调整
fbp/release
Zongyu.Wang-王宗雨 2 months ago
parent
commit
1304d3ba7d
  1. 59
      designer-base/src/main/java/com/fine/theme/light/ui/FineCalendarPaneUI.java
  2. 140
      designer-base/src/main/java/com/fine/theme/light/ui/FineDayLabelUI.java
  3. 1
      designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java
  4. 12
      designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java
  5. 10
      designer-base/src/main/java/com/fr/design/gui/date/CalendarNumberField.java
  6. 495
      designer-base/src/main/java/com/fr/design/gui/date/UICalendarPanel.java
  7. 3
      designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java
  8. 74
      designer-base/src/main/java/com/fr/design/gui/date/UIDayLabel.java
  9. 3
      designer-base/src/main/resources/com/fine/theme/icon/left_arrow.svg
  10. 3
      designer-base/src/main/resources/com/fine/theme/icon/right_arrow.svg
  11. 2
      designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json
  12. 2
      designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties
  13. 20
      designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties
  14. 32
      designer-base/src/test/java/com/fr/design/gui/storybook/components/UICalendarPaneStoryBoard.java

59
designer-base/src/main/java/com/fine/theme/light/ui/FineCalendarPaneUI.java

@ -0,0 +1,59 @@
package com.fine.theme.light.ui;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.fr.design.gui.date.UICalendarPanel;
import javax.swing.JComponent;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.PanelUI;
import java.awt.Color;
/**
* {@link UICalendarPanel} UI 样式
*
* @author lemon
* @since 12.0
* Created on 2024/09/22
*/
public class FineCalendarPaneUI extends PanelUI {
protected Color defaultBackground;
/**
* @param shared
* @since 2
*/
protected FineCalendarPaneUI() {
super();
}
/**
* 创建UI
*
* @param c 组件
* @return ComponentUI
*/
public static ComponentUI createUI(JComponent c) {
return FlatUIUtils.createSharedUI(FineCalendarPaneUI.class, FineCalendarPaneUI::new);
}
/**
* @param c the component where this UI delegate is being installed
*/
public void installUI(JComponent c) {
super.installUI(c);
defaultBackground = UIManager.getColor("Calendar.background");
//renderer this
c.setBackground(defaultBackground);
c.setBorder(new LineBorder(FlatUIUtils.getUIColor("defaultBorderColor", Color.BLACK)));
}
@Override
public void uninstallUI(JComponent c) {
super.uninstallUI(c);
}
}

140
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 <code>Graphics</code> 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();
}
}
}
}

1
designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java

@ -51,6 +51,7 @@ public interface FineUIStyle {
String DEFAULT_TABLE = "defaultTable"; String DEFAULT_TABLE = "defaultTable";
String WHITE_BUTTON = "whiteButton"; String WHITE_BUTTON = "whiteButton";
String ORIGINAL_BUTTON = "originalButton"; String ORIGINAL_BUTTON = "originalButton";
String GRAY_BUTTON = "grayButton";
String DETAIL_LABEL = "detailLabel"; String DETAIL_LABEL = "detailLabel";
String WIDGET_EVENT_LABEL = "widgetEventLabel"; String WIDGET_EVENT_LABEL = "widgetEventLabel";

12
designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java

@ -706,11 +706,21 @@ public class PreviewTablePane extends BasicPane {
}; };
previewPane.setLayout(FRGUIPaneFactory.createBorderLayout()); previewPane.setLayout(FRGUIPaneFactory.createBorderLayout());
if (nameDataModels.length > 0) { if (nameDataModels.length > 0) {
previewPane.add(tabbedPane.withHeadRatio(0.8f).withTabLayout(buildTabLayout(nameDataModels)).build(), BorderLayout.CENTER); int[] tabLayout = buildTabLayout(nameDataModels);
float headRatio = buildHeadRatio(tabLayout);
previewPane.add(tabbedPane.withHeadRatio(headRatio).withTabLayout(tabLayout).build(), BorderLayout.CENTER);
} }
previewPane.showWindow(new JFrame()).setVisible(true); previewPane.showWindow(new JFrame()).setVisible(true);
} }
private static float buildHeadRatio(int[] tabLayout) {
float maxLen = 0.8f;
if (tabLayout.length == 1) {
return (float) tabLayout[0] / TAB_MAX_COUNT_WITH_LINE;
}
return maxLen;
}
private static int[] buildTabLayout(NameDataModel[] nameDataModels) { private static int[] buildTabLayout(NameDataModel[] nameDataModels) {
int length = nameDataModels.length; int length = nameDataModels.length;
int size = (length + TAB_MAX_COUNT_WITH_LINE - 1) / TAB_MAX_COUNT_WITH_LINE; int size = (length + TAB_MAX_COUNT_WITH_LINE - 1) / TAB_MAX_COUNT_WITH_LINE;

10
designer-base/src/main/java/com/fr/design/gui/date/CalendarNumberField.java

@ -12,6 +12,8 @@ import java.awt.Toolkit;
import java.awt.event.FocusAdapter; import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
import static com.fine.theme.utils.FineUIScale.createScaleDimension;
/** /**
* Created with IntelliJ IDEA. * Created with IntelliJ IDEA.
* User: 小灰灰 * User: 小灰灰
@ -19,12 +21,13 @@ import java.awt.event.FocusEvent;
* Time: 上午11:06 * Time: 上午11:06
* To change this template use File | Settings | File Templates. * 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; private static final int NUM_TEN = 10;
public CalendarNumberField(double maxValue) { public CalendarNumberField(double maxValue) {
super(2, 0, 0, maxValue); super(2, 0, 0, maxValue);
this.setHorizontalAlignment(CENTER);
this.setBorderPainted(false); this.setBorderPainted(false);
addFocusListener(new FocusAdapter() { addFocusListener(new FocusAdapter() {
@Override @Override
@ -32,7 +35,6 @@ public class CalendarNumberField extends UINumberField {
setValue(getIntValue()); setValue(getIntValue());
} }
}); });
this.setFont(DesignUtils.getDefaultGUIFont());
} }
public void setValue(int value) { public void setValue(int value) {
@ -96,7 +98,7 @@ public class CalendarNumberField extends UINumberField {
} }
public Dimension getPreferredSize() { public Dimension getPreferredSize() {
return new Dimension(24, 11); return createScaleDimension(24, 24);
} }
public boolean shouldResponseChangeListener() { public boolean shouldResponseChangeListener() {
@ -104,7 +106,7 @@ public class CalendarNumberField extends UINumberField {
} }
public Insets getInsets() { public Insets getInsets() {
return new Insets(0, 6, 0, 4); return new Insets(0, 0, 0, 0);
} }
} }

495
designer-base/src/main/java/com/fr/design/gui/date/UICalendarPanel.java

@ -1,53 +1,41 @@
package com.fr.design.gui.date; package com.fr.design.gui.date;
import com.fanruan.product.ProductConstantsBase; import com.fanruan.product.ProductConstantsBase;
import com.formdev.flatlaf.ui.FlatUIUtils; import com.fine.theme.icon.LazyIcon;
import com.fine.theme.light.ui.FineRoundBorder;
import com.fine.theme.utils.FineUIStyle;
import com.fine.theme.utils.FineUIUtils;
import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.formdev.flatlaf.util.ScaledEmptyBorder;
import com.fr.base.BaseUtils; import com.fr.design.border.FineBorderFactory;
import com.fr.base.background.GradientBackground;
import com.fr.design.carton.MonthlyCartonFile; import com.fr.design.carton.MonthlyCartonFile;
import com.fr.design.carton.SwitchForSwingChecker; import com.fr.design.carton.SwitchForSwingChecker;
import com.fr.design.constants.UIConstants;
import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.utils.DesignUtils; import com.fr.design.utils.DesignUtils;
import com.fr.design.utils.gui.GUIPaintUtils;
import com.fr.general.GeneralUtils; import com.fr.general.GeneralUtils;
import com.fr.stable.Constants;
import com.fr.stable.StableUtils; import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import javax.swing.BorderFactory;
import javax.swing.Box; import javax.swing.Box;
import javax.swing.Icon; import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.SwingConstants; import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList; import javax.swing.event.EventListenerList;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font; import java.awt.Font;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout; import java.awt.GridLayout;
import java.awt.Insets; import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; import java.awt.event.MouseListener;
import java.awt.geom.RoundRectangle2D;
import java.io.File; import java.io.File;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
@ -55,25 +43,24 @@ import java.util.Date;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import static com.fine.swing.ui.layout.Layouts.cell;
import static com.fine.swing.ui.layout.Layouts.fix;
import static com.fine.swing.ui.layout.Layouts.flex;
import static com.fine.swing.ui.layout.Layouts.row;
import static com.fine.theme.utils.FineUIScale.createScaleDimension;
import static com.fine.theme.utils.FineUIScale.scale; import static com.fine.theme.utils.FineUIScale.scale;
import static com.fine.theme.utils.FineUIStyle.STYLE_TEXT;
import static com.fine.theme.utils.FineUIStyle.setStyle;
public class UICalendarPanel extends JPanel { public class UICalendarPanel extends JPanel {
private static final Font FONT_UI = DesignUtils.getDefaultGUIFont().applySize(scale(12)); private static final String UI_CLASS_ID = "CalendarPaneUI";
private static final Font FONT_BLACK = new Font(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Black_Font"), Font.PLAIN, scale(12));
private static final int WEEKDAY_COUNT = 7; private static final int WEEKDAY_COUNT = 7;
private static final int TOTAL_DAYS_COUNT = 42; private static final int TOTAL_DAYS_COUNT = 42;
protected final Insets defaultInsets = new Insets(0, 6, 0, 6);
private static final int WIDTH = scale(31);
private static final int HEIGHT = scale(19);
private static final int START_X = scale(30);
private static final int START_Y = scale(19);
//卡顿日志所在地址 //卡顿日志所在地址
private static final String JOURNAL_FILE_PATH = StableUtils.pathJoin(ProductConstantsBase.getEnvHome(), "journal_log"); private static final String JOURNAL_FILE_PATH = StableUtils.pathJoin(ProductConstantsBase.getEnvHome(), "journal_log");
protected Color selectedBackground;
protected Color selectedForeground;
protected Color background;
protected Color foreground;
private Calendar calendar = null; private Calendar calendar = null;
private UILabel monthLabel = null; private UILabel monthLabel = null;
@ -83,9 +70,11 @@ public class UICalendarPanel extends JPanel {
private boolean isSupportDateChangeListener = false; private boolean isSupportDateChangeListener = false;
private java.util.Date selectedDate = null; private java.util.Date selectedDate = null;
private boolean isTimePicker; private boolean isTimePicker;
private final Color LABEL_FORGE_GROUND = new Color(0x6F6F6);
private MouseListener todayListener; private MouseListener todayListener;
private UIDayLabel lbToday; private UIDayLabel lbToday;
private static final int WEEK_LABEL_WIDTH = 24;
private static final int WEEK_LABEL_HEIGHT = 24;
private final int ICON_WIDTH = 12;
/** /**
* 一个int类型用于判断日历是否是专门用于处理卡顿的设计器反馈箱中的日历 * 一个int类型用于判断日历是否是专门用于处理卡顿的设计器反馈箱中的日历
* 0表示是 * 0表示是
@ -125,26 +114,12 @@ public class UICalendarPanel extends JPanel {
this.selectedDate = selectedDate; this.selectedDate = selectedDate;
this.isTimePicker = isTimerPicker; this.isTimePicker = isTimerPicker;
calendar = Calendar.getInstance(); calendar = Calendar.getInstance();
selectedBackground = UIManager.getColor(
"ComboBox.selectionBackground");
selectedForeground = UIManager.getColor(
"ComboBox.selectionForeground");
background = UIManager.getColor("ComboBox.background");
foreground = UIManager.getColor("ComboBox.foreground");
dayBttListener = createDayBttListener(); dayBttListener = createDayBttListener();
//renderer this
setPreferredSize(scale(new Dimension(218, 179)));
setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE));
setBorder(new LineBorder(FlatUIUtils.getUIColor("defaultBorderColor", Color.BLACK)));
setLayout(FRGUIPaneFactory.createBorderLayout()); setLayout(FRGUIPaneFactory.createBorderLayout());
add(BorderLayout.NORTH, createNorthPane()); add(BorderLayout.NORTH, createNorthPane());
add(BorderLayout.CENTER, createCenterPane()); add(BorderLayout.CENTER, createCenterPane());
if (isTimerPicker) { if (isTimerPicker) {
setPreferredSize(scale(new Dimension(218, 209)));
add(BorderLayout.SOUTH, createSouthPane()); add(BorderLayout.SOUTH, createSouthPane());
updateHMS(); updateHMS();
} }
@ -158,45 +133,23 @@ public class UICalendarPanel extends JPanel {
// << < yyyy/MM/dd > >> // << < yyyy/MM/dd > >>
private JPanel createNorthPane() { private JPanel createNorthPane() {
JPanel pNorth = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); JPanel pNorth = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane();
pNorth.setBackground(new Color(0xFFFFFF)); pNorth.setPreferredSize(new Dimension(pNorth.getPreferredSize().width, scale(40)));
pNorth.setPreferredSize(scale(new Dimension(1, 22))); pNorth.setOpaque(false);
pNorth.add(Box.createHorizontalStrut(5)); pNorth.add(Box.createHorizontalStrut(5));
pNorth.add(createSkipButton(Calendar.YEAR, -1, new Icon[]{ pNorth.add(createSkipButton(Calendar.YEAR, -1, new LazyIcon("drag_left")));
BaseUtils.readIcon("/com/fr/design/images/calender/year_reduce.png"),
BaseUtils.readIcon("/com/fr/design/images/calender/year_reduce_hover.png"),
BaseUtils.readIcon("/com/fr/design/images/calender/year_reduce_click.png")
}));
pNorth.add(Box.createHorizontalStrut(11)); pNorth.add(Box.createHorizontalStrut(11));
UILabel monthMinus = createSkipButton(Calendar.MONTH, -1, new Icon[]{ UIButton monthMinus = createSkipButton(Calendar.MONTH, -1, new LazyIcon("left_arrow"));
BaseUtils.readIcon("/com/fr/design/images/calender/month_reduce.png"),
BaseUtils.readIcon("/com/fr/design/images/calender/month_reduce_hover.png"),
BaseUtils.readIcon("/com/fr/design/images/calender/month_reduce_click.png")
});
monthMinus.setPreferredSize(scale(new Dimension(20, 20)));
pNorth.add(monthMinus); pNorth.add(monthMinus);
monthLabel = new UILabel("", UILabel.CENTER); monthLabel = new UILabel("", UILabel.CENTER);
monthLabel.setBackground(new Color(0xFFFFFF));
monthLabel.setForeground(new Color(0x000000));
monthLabel.setFont(FONT_UI);
pNorth.add(Box.createHorizontalGlue()); pNorth.add(Box.createHorizontalGlue());
pNorth.add(monthLabel); pNorth.add(monthLabel);
pNorth.add(Box.createHorizontalGlue()); pNorth.add(Box.createHorizontalGlue());
UILabel monthPlus = createSkipButton(Calendar.MONTH, 1, new Icon[]{ UIButton monthPlus = createSkipButton(Calendar.MONTH, 1, new LazyIcon("right_arrow"));
BaseUtils.readIcon("/com/fr/design/images/calender/month_add.png"),
BaseUtils.readIcon("/com/fr/design/images/calender/month_add_hover.png"),
BaseUtils.readIcon("/com/fr/design/images/calender/month_add_click.png")
});
monthPlus.setPreferredSize(scale(new Dimension(20, 20)));
monthPlus.setHorizontalAlignment(SwingConstants.RIGHT); monthPlus.setHorizontalAlignment(SwingConstants.RIGHT);
pNorth.add(monthPlus); pNorth.add(monthPlus);
pNorth.add(Box.createHorizontalStrut(11)); pNorth.add(Box.createHorizontalStrut(11));
pNorth.add(createSkipButton(Calendar.YEAR, 1, new Icon[]{ pNorth.add(createSkipButton(Calendar.YEAR, 1, new LazyIcon("drag_right")));
BaseUtils.readIcon("/com/fr/design/images/calender/year_add.png"),
BaseUtils.readIcon("/com/fr/design/images/calender/year_add_hover.png"),
BaseUtils.readIcon("/com/fr/design/images/calender/year_add_click.png")
}));
pNorth.add(Box.createHorizontalStrut(5)); pNorth.add(Box.createHorizontalStrut(5));
return pNorth; return pNorth;
@ -205,10 +158,8 @@ public class UICalendarPanel extends JPanel {
private JPanel createCenterPane() { private JPanel createCenterPane() {
//星期日 星期一 星期二 星期三 星期四 星期五 星期六 //星期日 星期一 星期二 星期三 星期四 星期五 星期六
JPanel pWeeks = new JPanel(new GridLayout(1, 7, 1, 0)); JPanel pWeeks = new JPanel(new GridLayout(1, 7, 9, 0));
pWeeks.setPreferredSize(scale(new Dimension(216, 22))); pWeeks.setOpaque(false);
pWeeks.setBackground(new Color(0xFFFFFF));
pWeeks.setOpaque(true);
String[] strWeeks = new String[]{StringUtils.EMPTY, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Sun"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Mon"), String[] strWeeks = new String[]{StringUtils.EMPTY, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Sun"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Mon"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tue"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Wed"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Thu"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tue"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Wed"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Thu"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Fri"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Sat") com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Fri"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Sat")
@ -216,61 +167,47 @@ public class UICalendarPanel extends JPanel {
for (int i = 1; i <= WEEKDAY_COUNT; i++) { for (int i = 1; i <= WEEKDAY_COUNT; i++) {
UILabel label = new UILabel(); UILabel label = new UILabel();
label.setHorizontalAlignment(UILabel.CENTER); label.setHorizontalAlignment(UILabel.CENTER);
label.setForeground(new Color(0x4D4C4C));
label.setFont(FONT_BLACK);
label.setText(strWeeks[i]); label.setText(strWeeks[i]);
label.setPreferredSize(createScaleDimension(WEEK_LABEL_WIDTH, WEEK_LABEL_HEIGHT));
pWeeks.add(label); pWeeks.add(label);
} }
pWeeks.setBorder(new ScaledEmptyBorder(3, 9, 3, 9));
//中间放日期的面板 //中间放日期的面板
days = new DayPane(); days = new DayPane();
days.setOpaque(true); days.setOpaque(false);
days.setPreferredSize(scale(new Dimension(216, 115))); days.setPreferredSize(new Dimension(pWeeks.getPreferredSize().width, scale(165)));
JPanel pCenter = FRGUIPaneFactory.createBorderLayout_S_Pane(); JPanel pCenter = FRGUIPaneFactory.createBorderLayout_S_Pane();
pCenter.setOpaque(true); pCenter.setOpaque(false);
pCenter.add(pWeeks, BorderLayout.NORTH); pCenter.add(pWeeks, BorderLayout.NORTH);
pCenter.add(days, BorderLayout.CENTER); pCenter.add(days, BorderLayout.CENTER);
//显示今天的日期,直接单击图标跳到今天 //显示今天的日期,直接单击图标跳到今天
GradientPane pToday = new GradientPane(new GradientBackground(new Color(0x097BDA), new Color(0x40A3EE), GradientBackground.TOP2BOTTOM), false);
pToday.setPreferredSize(scale(new Dimension(216, 18)));
pToday.setLayout(new BorderLayout());
lbToday = new UIDayLabel(new Date(), false); lbToday = new UIDayLabel(new Date(), false);
lbToday.setForeground(new Color(0x000000)); lbToday.setPreferredSize(new Dimension(lbToday.getPreferredSize().width, scale(30)));
todayListener = createTodayListener(pToday, lbToday); lbToday.setBorder(FineBorderFactory.createDefaultTopBorder());
todayListener = createTodayListener(lbToday);
lbToday.addMouseListener(todayListener); lbToday.addMouseListener(todayListener);
pToday.setBackground(new Color(0xF0F0F0)); pCenter.add(lbToday, BorderLayout.SOUTH);
pToday.add(lbToday, BorderLayout.CENTER);
pCenter.add(pToday, BorderLayout.SOUTH);
return pCenter; return pCenter;
} }
private JPanel createSouthPane() { private JPanel createSouthPane() {
JPanel sPane = new JPanel(); JPanel sPane = new JPanel();
sPane.setPreferredSize(scale(new Dimension(216, 30))); sPane.setOpaque(false);
sPane.setBackground(Color.WHITE); sPane.setLayout(new BorderLayout());
sPane.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 6));
UILabel timeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Time") + ":"); UILabel timeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Time") + ":");
timeLabel.setBorder(new ScaledEmptyBorder(0, 9, 0, 5));
timeLabel.setFont(FONT_UI);
sPane.add(timeLabel);
hms = new HMSPane(); hms = new HMSPane();
sPane.add(hms);
UILabel gap = new UILabel();
gap.setPreferredSize(scale(new Dimension(26, 1)));
sPane.add(gap);
UIButton okButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")) { UIButton okButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")) {
public Dimension getPreferredSize() { public Dimension getPreferredSize() {
return scale(new Dimension(32, 18)); return createScaleDimension(48, 24);
} }
public Insets getInsets() { public Insets getInsets() {
return new Insets(0, 0, 0, 0); return new Insets(0, 0, 0, 0);
} }
}; };
okButton.setFont(FONT_UI);
okButton.setVerticalAlignment(SwingConstants.CENTER); okButton.setVerticalAlignment(SwingConstants.CENTER);
okButton.addActionListener(new ActionListener() { okButton.addActionListener(new ActionListener() {
@ -282,18 +219,11 @@ public class UICalendarPanel extends JPanel {
} }
}); });
sPane.add(okButton); sPane.add(row(cell(timeLabel).weight(36), cell(hms).weight(180), flex(), cell(okButton).weight(48)).getComponent());
sPane.setBorder(new ScaledEmptyBorder(10, 12, 10, 12));
return sPane; return sPane;
} }
public void resetHMSPaneSelectedNumberField() {
if (this.hms != null) {
this.hms.selectedNumberField = this.hms.hField;
this.hms.nextButton.requestFocus();
}
}
/** /**
* 创建上一月,下一月,上一年,下一年"按钮" * 创建上一月,下一月,上一年,下一年"按钮"
* *
@ -301,37 +231,20 @@ public class UICalendarPanel extends JPanel {
* @param amount int * @param amount int
* @return UILabel * @return UILabel
*/ */
protected UILabel createSkipButton(final int field, final int amount, final Icon[] icons) { protected UIButton createSkipButton(final int field, final int amount, final Icon icon) {
if (icons.length != 3) { UIButton button = new UIButton();
return new UILabel(); FineUIStyle.setStyle(button, FineUIStyle.ORIGINAL_BUTTON);
} button.setIcon(icon);
UILabel label = new UILabel(); button.setRequestFocusEnabled(false);
label.setIcon(icons[0]); button.addMouseListener(createSkipListener(field, amount));
label.setRequestFocusEnabled(false); return button;
label.addMouseListener(createSkipListener(label, field, amount, icons));
return label;
} }
protected MouseListener createSkipListener(final UILabel label, final int field, protected MouseListener createSkipListener(final int field, final int amount) {
final int amount, final Icon[] icons) {
return new MouseAdapter() { return new MouseAdapter() {
public void mouseReleased(MouseEvent e) { public void mouseReleased(MouseEvent e) {
label.setIcon(icons[1]);
calendar.add(field, amount); calendar.add(field, amount);
updateDays(); updateDays();
resetHMSPaneSelectedNumberField();
}
public void mouseEntered(MouseEvent e) {
label.setIcon(icons[1]);
}
public void mouseExited(MouseEvent e) {
label.setIcon(icons[0]);
}
public void mousePressed(MouseEvent e) {
label.setIcon(icons[2]);
} }
}; };
} }
@ -383,10 +296,6 @@ public class UICalendarPanel extends JPanel {
} }
} else { } else {
label.addMouseListener(dayBttListener); label.addMouseListener(dayBttListener);
label.setEnabled(isCurrentMonth);
}
if (!isCurrentMonth) {
label.setForeground(LABEL_FORGE_GROUND);
} }
} }
/** /**
@ -432,30 +341,23 @@ public class UICalendarPanel extends JPanel {
} }
for (int i = 0; i < TOTAL_DAYS_COUNT; i++) { for (int i = 0; i < TOTAL_DAYS_COUNT; i++) {
setupCalendar.add(Calendar.DATE, 1); setupCalendar.add(Calendar.DATE, 1);
GradientPane gp = new GradientPane(new GradientBackground(new Color(0xFEFEFE), new Color(0xF3F2F3), GradientBackground.TOP2BOTTOM), true);
gp.setIndex(i);
gp.setLayout(new BorderLayout());
gp.setBorder(null);
UIDayLabel label = new UIDayLabel(setupCalendar.getTime()); UIDayLabel label = new UIDayLabel(setupCalendar.getTime());
label.setHorizontalAlignment(SwingConstants.RIGHT); label.setIndex(i);
label.setBorder(new ScaledEmptyBorder(0, 0, 0, 9));
if ("1".equals(label.getText())) { if ("1".equals(label.getText())) {
isCurrentMonth = !isCurrentMonth; isCurrentMonth = !isCurrentMonth;
} }
setUIDayLabel(label, isCurrentMonth, setupCalendar, logSet); setUIDayLabel(label, isCurrentMonth, setupCalendar, logSet);
label.setCurrentMonth(isCurrentMonth);
days.add(label);
//当前选择的日期 //当前选择的日期
if (setupCalendar.get(Calendar.DAY_OF_MONTH) == selectedCalendar.get(Calendar.DAY_OF_MONTH) && isCurrentMonth) { if (setupCalendar.get(Calendar.DAY_OF_MONTH) == selectedCalendar.get(Calendar.DAY_OF_MONTH) && isCurrentMonth) {
gp.setGradientBackground(new GradientBackground(new Color(0x097BD9), new Color(0x41A3EE), GradientBackground.TOP2BOTTOM));
gp.add(label, BorderLayout.CENTER);
days.add(gp);
days.setSelectedIndex(i); days.setSelectedIndex(i);
label.setSelected(true);
this.selectedDate = label.getDate(); this.selectedDate = label.getDate();
this.calendar.setTime(this.selectedDate); this.calendar.setTime(this.selectedDate);
} else {
gp.add(label, BorderLayout.CENTER);
days.add(gp);
} }
} }
days.setBorder(new ScaledEmptyBorder(3, 9, 3, 9));
days.validate(); days.validate();
} }
@ -466,33 +368,11 @@ public class UICalendarPanel extends JPanel {
} }
} }
protected MouseListener createTodayListener(final GradientPane jp, final UIDayLabel label) { protected MouseListener createTodayListener(final UIDayLabel label) {
return new MouseAdapter() { return new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
jp.setBorder(BorderFactory.createLineBorder(new Color(0x3868AA)));
jp.setPaintGradientBackground(true);
jp.repaint();
label.setForeground(new Color(0xFFFFFF));
}
@Override
public void mouseExited(MouseEvent e) {
jp.setBackground(new Color(0xF0F0F0));
}
@Override
public void mouseEntered(MouseEvent e) {
jp.setBackground(new Color(0xC8DDEE));
}
@Override @Override
public void mouseReleased(MouseEvent e) { public void mouseReleased(MouseEvent e) {
jp.setBackground(new Color(0xF0F0F0));
label.setForeground(new Color(0x000000));
jp.setBorder(null);
jp.setPaintGradientBackground(false);
jp.repaint();
if (isTimePicker) { if (isTimePicker) {
UICalendarPanel.this.setSelectedDate(label.getDate()); UICalendarPanel.this.setSelectedDate(label.getDate());
updateDays(); updateDays();
@ -501,7 +381,6 @@ public class UICalendarPanel extends JPanel {
UICalendarPanel.this.setSelectedDate(label.getDate()); UICalendarPanel.this.setSelectedDate(label.getDate());
UICalendarPanel.this.isSupportDateChangeListener = false; UICalendarPanel.this.isSupportDateChangeListener = false;
} }
resetHMSPaneSelectedNumberField();
} }
}; };
} }
@ -511,12 +390,11 @@ public class UICalendarPanel extends JPanel {
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
if (isEnabled()) { if (isEnabled()) {
UIDayLabel com = (UIDayLabel) e.getComponent(); UIDayLabel com = (UIDayLabel) e.getComponent();
GradientPane gp = (GradientPane) com.getParent(); days.setSelectedIndex(com.getIndex());
if (days.selectedIndex != -1) { com.setHovered(false);
((GradientPane) days.getComponent(days.selectedIndex)).setGradientBackground(new GradientBackground(new Color(0xFEFEFE), new Color(0xF3F2F3), GradientBackground.TOP2BOTTOM)); com.setPressed(true);
} com.getParent().validate();
gp.setGradientBackground(new GradientBackground(new Color(0x097BD9), new Color(0x41A3EE), GradientBackground.TOP2BOTTOM)); com.getParent().repaint();
days.setSelectedIndex(gp.getIndex());
} }
} }
@ -530,31 +408,30 @@ public class UICalendarPanel extends JPanel {
UICalendarPanel.this.setSelectedDate(com.getDate()); UICalendarPanel.this.setSelectedDate(com.getDate());
UICalendarPanel.this.isSupportDateChangeListener = false; UICalendarPanel.this.isSupportDateChangeListener = false;
} }
resetHMSPaneSelectedNumberField();
} }
public void mouseEntered(MouseEvent e) { public void mouseEntered(MouseEvent e) {
if (isEnabled()) { if (isEnabled()) {
JComponent com = (JComponent) e.getComponent(); UIDayLabel com = (UIDayLabel) e.getComponent();
GradientPane gp = (GradientPane) com.getParent(); com.setHovered(true);
if (gp.getIndex() == days.selectedIndex) { if (com.getIndex() == days.selectedIndex) {
return; return;
} }
gp.setGradientBackground(new GradientBackground(new Color(0xFFFFFF), new Color(0xEAF4FC), GradientBackground.TOP2BOTTOM)); days.setFloatIndex(com.getIndex());
days.setFloatIndex(gp.getIndex()); com.getParent().validate();
com.getParent().repaint();
} }
} }
public void mouseExited(MouseEvent e) { public void mouseExited(MouseEvent e) {
if (isEnabled()) { if (isEnabled()) {
JComponent com = (JComponent) e.getComponent(); UIDayLabel com = (UIDayLabel) e.getComponent();
GradientPane gp = (GradientPane) com.getParent(); com.setHovered(false);
if (gp.getIndex() != days.selectedIndex) { com.setPressed(false);
gp.setGradientBackground(new GradientBackground(new Color(0xFEFEFE), new Color(0xF3F2F3), GradientBackground.TOP2BOTTOM));
}
days.setFloatIndex(-1); days.setFloatIndex(-1);
days.repaint(); com.getParent().validate();
com.getParent().repaint();
} }
} }
}; };
@ -596,127 +473,34 @@ public class UICalendarPanel extends JPanel {
return selectedDate; return selectedDate;
} }
private class GradientPane extends JPanel {
private int index;
private boolean isGradientBackground;
private GradientBackground gradientBackground;
public GradientPane() {
}
public GradientPane(GradientBackground gradientBackground, boolean isGradientBackground) {
super();
this.gradientBackground = gradientBackground;
this.isGradientBackground = isGradientBackground;
}
public void paint(Graphics g) {
super.paint(g);
if (isGradientBackground && gradientBackground != null) {
gradientBackground.paint(g, new Rectangle(this.getWidth(), this.getHeight()));
}
paintChildren(g);
}
public void setPaintGradientBackground(boolean flag) {
this.isGradientBackground = flag;
}
public void setGradientBackground(GradientBackground gradientBackground) {
this.gradientBackground = gradientBackground;
}
public void setIndex(int i) {
this.index = i;
}
public int getIndex() {
return this.index;
}
public void setForeground(Color c) {
super.setForeground(c);
if (getComponentCount() > 0) {
getComponent(0).setForeground(c);
}
}
}
private class DayPane extends JPanel { private class DayPane extends JPanel {
private Color floatColor = new Color(0xC5E2F9); private Color floatColor = new Color(0xC5E2F9);
private Color selectedColor = new Color(0x41A3EE);
private int floateIndex; private int floateIndex;
private int selectedIndex; private int selectedIndex;
public DayPane() { public DayPane() {
floateIndex = -1; floateIndex = -1;
selectedIndex = -1; selectedIndex = -1;
this.setLayout(new GridLayout(6, 7, 1, 1)); this.setLayout(new GridLayout(6, 7, scale(9), scale(3)));
this.setBackground(new Color(0xFFFFFF));
this.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, new Color(0xDADADA)));
} }
public void paint(Graphics g) { public void paint(Graphics g) {
super.paint(g); super.paint(g);
int width = UICalendarPanel.WIDTH;
int height = UICalendarPanel.HEIGHT;
Color oldColor = g.getColor(); Color oldColor = g.getColor();
g.setColor(new Color(0xDADADA));
int start_x = UICalendarPanel.START_X;
int start_y = UICalendarPanel.START_Y;
for (int i = 0; i < 6; i++) {
g.drawLine(start_x, 0, start_x, getHeight());
start_x += width;
}
for (int i = 0; i < 5; i++) {
g.drawLine(0, start_y, getWidth(), start_y);
start_y += height;
}
if (floateIndex > -1) { if (floateIndex > -1) {
g.setColor(floatColor); g.setColor(floatColor);
paintChindPane(g, floateIndex);
}
if (selectedIndex > -1) {
g.setColor(selectedColor);
paintChindPane(g, selectedIndex);
} }
g.setColor(oldColor); g.setColor(oldColor);
} }
private void paintChindPane(Graphics g, int index) {
if (index % 7 == 0) {
int y1 = index / 7 * UICalendarPanel.HEIGHT;
g.drawLine(0, y1, UICalendarPanel.START_X, y1);
g.drawLine(0, y1 + UICalendarPanel.HEIGHT, UICalendarPanel.START_X, y1 + UICalendarPanel.HEIGHT);
g.drawLine(UICalendarPanel.START_X, y1, UICalendarPanel.START_X, y1 + UICalendarPanel.HEIGHT);
} else if (index % 7 == 6) {
int y1 = index / 7 * UICalendarPanel.HEIGHT;
g.drawLine(scale(185), y1, scale(216), y1);
g.drawLine(scale(185), y1 + UICalendarPanel.HEIGHT, scale(216), y1 + UICalendarPanel.HEIGHT);
g.drawLine(scale(185), y1, scale(185), y1 + UICalendarPanel.HEIGHT);
} else {
int x1 = index % 7 * UICalendarPanel.WIDTH - 1;
int y1 = index / 7 * UICalendarPanel.HEIGHT;
g.drawRect(x1, y1, UICalendarPanel.WIDTH, UICalendarPanel.HEIGHT);
}
}
public void setFloatIndex(int index) { public void setFloatIndex(int index) {
this.floateIndex = index; this.floateIndex = index;
repaint(); repaint();
} }
public void setSelectedIndex(int index) { public void setSelectedIndex(int index) {
if (this.selectedIndex != -1 && this.selectedIndex < getComponentCount()) {
this.getComponent(selectedIndex).setForeground(Color.black);
}
if (index != -1 && index < getComponentCount()) {
this.getComponent(index).setForeground(Color.WHITE);
}
this.selectedIndex = index; this.selectedIndex = index;
repaint(); repaint();
} }
@ -725,17 +509,13 @@ public class UICalendarPanel extends JPanel {
private class HMSPane extends JPanel { private class HMSPane extends JPanel {
private boolean isRolOver; private boolean isRolOver;
private UIButton preButton;
private UIButton nextButton;
private CalendarNumberField hField; private CalendarNumberField hField;
private CalendarNumberField mField; private CalendarNumberField mField;
private CalendarNumberField sField; private CalendarNumberField sField;
private CalendarNumberField selectedNumberField;
public HMSPane() { public HMSPane() {
this.setPreferredSize(scale(new Dimension(101, 18)));
this.setLayout(new BorderLayout(0, 0)); this.setLayout(new BorderLayout(0, 0));
this.setBackground(null); this.setOpaque(false);
initComponents(); initComponents();
initListener(); initListener();
@ -757,49 +537,68 @@ public class UICalendarPanel extends JPanel {
} }
private void initComponents() { private void initComponents() {
JPanel jp = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 2));
jp.setBackground(null);
jp.setBorder(null);
hField = new CalendarNumberField(23); hField = new CalendarNumberField(23);
mField = new CalendarNumberField(59); mField = new CalendarNumberField(59);
sField = new CalendarNumberField(59); sField = new CalendarNumberField(59);
selectedNumberField = hField; this.add(row(cell(combineFieldArrowPane(hField)), cell(createGapLabel()), cell(combineFieldArrowPane(mField)),
cell(createGapLabel()), cell(combineFieldArrowPane(sField)), fix(4)).getComponent(), BorderLayout.CENTER);
}
private JPanel combineFieldArrowPane(CalendarNumberField field) {
JPanel panel = new JPanel(new BorderLayout());
panel.setOpaque(false);
Insets insets = FineUIUtils.getUIInsets("InputTextField.borderInsets", defaultInsets);
field.setBorder(new ScaledEmptyBorder(insets.top, insets.left, insets.bottom, insets.right));
UIButton preButton = createArrowButton(new LazyIcon("up_arrow", ICON_WIDTH));
UIButton nextButton = createArrowButton(new LazyIcon("down_arrow", ICON_WIDTH));
JPanel arrowPane = createArrowPane(preButton, nextButton);
panel.add(field, BorderLayout.CENTER);
panel.add(arrowPane, BorderLayout.EAST);
panel.setBorder(new FineRoundBorder());
jp.add(hField); nextButton.addActionListener(new ActionListener() {
jp.add(createGapLabel()); @Override
jp.add(mField); public void actionPerformed(ActionEvent e) {
jp.add(createGapLabel()); field.setValue(field.getIntValue() - 1);
jp.add(sField); field.requestFocus();
field.selectAll();
this.add(jp, BorderLayout.CENTER);
preButton = new UIButton(UIConstants.ARROW_UP_ICON) {
public boolean shouldResponseChangeListener() {
return false;
} }
}; });
preButton.setRoundBorder(true, Constants.LEFT); preButton.addActionListener(new ActionListener() {
nextButton = new UIButton(UIConstants.ARROW_DOWN_ICON) { @Override
public boolean shouldResponseChangeListener() { public void actionPerformed(ActionEvent e) {
return false; field.setValue(field.getIntValue() + 1);
field.requestFocus();
field.selectAll();
} }
}; });
nextButton.setRoundBorder(true, Constants.LEFT); return panel;
}
private JPanel createArrowPane(UIButton preButton, UIButton nextButton) {
JPanel arrowPane = new JPanel(); JPanel arrowPane = new JPanel();
arrowPane.setPreferredSize(scale(new Dimension(11, 18))); arrowPane.setPreferredSize(createScaleDimension(12, 24));
arrowPane.setLayout(new GridLayout(2, 1)); arrowPane.setLayout(new GridLayout(2, 1));
arrowPane.add(preButton); arrowPane.add(preButton);
arrowPane.add(nextButton); arrowPane.add(nextButton);
this.add(arrowPane, BorderLayout.EAST); arrowPane.setOpaque(false);
return arrowPane;
} }
private void initListener() { private UIButton createArrowButton(Icon icon) {
MouseAdapter backgroundAdapter = new MouseAdapter() { UIButton arrowButton = new UIButton(icon) {
@Override public boolean shouldResponseChangeListener() {
public void mousePressed(MouseEvent e) { return false;
HMSPane.this.selectedNumberField = (CalendarNumberField) e.getComponent();
} }
};
setStyle(arrowButton, STYLE_TEXT);
return arrowButton;
}
private void initListener() {
MouseAdapter backgroundAdapter = new MouseAdapter() {
@Override @Override
public void mouseExited(MouseEvent e) { public void mouseExited(MouseEvent e) {
isRolOver = false; isRolOver = false;
@ -815,32 +614,10 @@ public class UICalendarPanel extends JPanel {
hField.addMouseListener(backgroundAdapter); hField.addMouseListener(backgroundAdapter);
mField.addMouseListener(backgroundAdapter); mField.addMouseListener(backgroundAdapter);
sField.addMouseListener(backgroundAdapter); sField.addMouseListener(backgroundAdapter);
nextButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
HMSPane.this.selectedNumberField.setValue(HMSPane.this.selectedNumberField.getIntValue() - 1);
HMSPane.this.selectedNumberField.requestFocus();
HMSPane.this.selectedNumberField.selectAll();
}
});
preButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
HMSPane.this.selectedNumberField.setValue(HMSPane.this.selectedNumberField.getIntValue() + 1);
HMSPane.this.selectedNumberField.requestFocus();
HMSPane.this.selectedNumberField.selectAll();
}
});
} }
private UILabel createGapLabel() { private JPanel createGapLabel() {
UILabel uiLabel = new UILabel(":"); return row(fix(4), cell(new UILabel(":")), fix(4)).getComponent();
uiLabel.setHorizontalAlignment(SwingConstants.CENTER);
uiLabel.setBackground(null);
uiLabel.setBorder(null);
uiLabel.setPreferredSize(scale(new Dimension(6, 10)));
return uiLabel;
} }
public Insets getInsets() { public Insets getInsets() {
@ -849,17 +626,6 @@ public class UICalendarPanel extends JPanel {
public void paint(Graphics g) { public void paint(Graphics g) {
super.paint(g); super.paint(g);
paintBorder(g);
}
public void paintBorder(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
if (isRolOver) {
Shape shape = new RoundRectangle2D.Double(1, 1, 86, 15, UIConstants.ARC, UIConstants.ARC);
GUIPaintUtils.paintBorderShadow(g2d, 3, shape, UIConstants.HOVER_BLUE, Color.WHITE);
} else {
GUIPaintUtils.drawBorder(g2d, 0, 0, 101, 18, true, 3);
}
} }
public void populate(Calendar calendar) { public void populate(Calendar calendar) {
@ -875,21 +641,8 @@ public class UICalendarPanel extends JPanel {
} }
} }
public static void main(String[] args) { @Override
JFrame frame = new JFrame(); public String getUIClassID() {
UICalendarPanel calendarPanel = new UICalendarPanel(); return UI_CLASS_ID;
final UITextField field = new UITextField();
field.setPreferredSize(new Dimension(120, 25));
calendarPanel.addDateChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
Date selectedDate = (Date) e.getSource();
SimpleDateFormat f = new SimpleDateFormat("yyyy/MM/dd");
field.setText(f.format(selectedDate));
}
});
frame.getContentPane().setLayout(FRGUIPaneFactory.createCenterFlowLayout());
frame.getContentPane().add(field);
frame.getContentPane().add(calendarPanel);
frame.setVisible(true);
} }
} }

3
designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java

@ -235,9 +235,6 @@ public class UIDatePicker extends UIComboBox implements Serializable {
if (willHide || UIDatePicker.this.isEnabled() == false) { if (willHide || UIDatePicker.this.isEnabled() == false) {
return; return;
} }
if (calendarPanel != null) {
calendarPanel.resetHMSPaneSelectedNumberField();
}
super.show(); super.show();
} }

74
designer-base/src/main/java/com/fr/design/gui/date/UIDayLabel.java

@ -1,18 +1,48 @@
package com.fr.design.gui.date; package com.fr.design.gui.date;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
import com.fr.design.utils.DesignUtils;
import java.awt.Dimension;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; 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 { public class UIDayLabel extends UILabel {
private static final String UI_CLASS_ID = "DayLabelUI";
private Date date = null; private Date date = null;
private int index;
private boolean pressed = false;
private boolean hovered = false;
private boolean selected = false;
private boolean currentMonth = false;
private boolean smallLabel = false;
public boolean isHovered() {
return hovered;
}
public boolean isPressed() {
return pressed;
}
public boolean isSelected() {
return selected;
}
public boolean isCurrentMonth() {
return currentMonth;
}
public boolean isSmallLabel() {
return smallLabel;
}
/** /**
* 日期格式TODAY/TIP用 * 日期格式TODAY/TIP用
@ -28,11 +58,11 @@ public class UIDayLabel extends UILabel {
} }
public UIDayLabel(Date date, boolean isSmallLabel) { public UIDayLabel(Date date, boolean isSmallLabel) {
setOpaque(false);
setHorizontalAlignment(UILabel.CENTER); setHorizontalAlignment(UILabel.CENTER);
setFont(DesignUtils.getDefaultGUIFont().applySize(scale(12)));
this.date = date; this.date = date;
setPreferredSize(scale(new Dimension(30, 18))); this.smallLabel = isSmallLabel;
if (isSmallLabel) { if (smallLabel) {
setText(dayFormat.format(date)); setText(dayFormat.format(date));
} else { } else {
setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Today") + ":" + dateFormat.format(new Date())); setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Today") + ":" + dateFormat.format(new Date()));
@ -44,8 +74,38 @@ public class UIDayLabel extends UILabel {
return date; return date;
} }
public void setHovered(boolean hovered) {
this.hovered = hovered;
}
public void setPressed(boolean pressed) {
this.pressed = pressed;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public void setCurrentMonth(boolean currentMonth) {
this.currentMonth = currentMonth;
}
public void setDate(Date date) { public void setDate(Date date) {
this.date = date; this.date = date;
} }
public void setIndex(int i) {
this.index = i;
}
public int getIndex() {
return this.index;
}
@Override
public String getUIClassID() {
return UI_CLASS_ID;
}
} }

3
designer-base/src/main/resources/com/fine/theme/icon/left_arrow.svg

@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.8033 24.4853C19.4128 24.8758 18.7796 24.8758 18.3891 24.4853L9.90381 16L18.3891 7.51473C18.7796 7.12421 19.4128 7.12419 19.8033 7.51473C20.1938 7.90527 20.1938 8.53842 19.8033 8.92894L12.7322 16L19.8033 23.0711C20.1938 23.4616 20.1938 24.0948 19.8033 24.4853Z" fill="#0A1C38" fill-opacity="0.9"/>
</svg>

After

Width:  |  Height:  |  Size: 413 B

3
designer-base/src/main/resources/com/fine/theme/icon/right_arrow.svg

@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.1967 7.51474C12.5872 7.12421 13.2204 7.12422 13.6109 7.51474L22.0962 16L13.6109 24.4853C13.2204 24.8758 12.5872 24.8758 12.1967 24.4853C11.8062 24.0948 11.8062 23.4616 12.1967 23.0711L19.2678 16L12.1967 8.92895C11.8062 8.53843 11.8062 7.90526 12.1967 7.51474Z" fill="#0A1C38" fill-opacity="0.9"/>
</svg>

After

Width:  |  Height:  |  Size: 413 B

2
designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json

@ -29,6 +29,8 @@
"drag_right": "drag_right.svg", "drag_right": "drag_right.svg",
"down_arrow": "down_arrow.svg", "down_arrow": "down_arrow.svg",
"up_arrow": "up_arrow.svg", "up_arrow": "up_arrow.svg",
"left_arrow": "left_arrow.svg",
"right_arrow": "right_arrow.svg",
"select": "select.svg", "select": "select.svg",
"recycle": "recycle.svg", "recycle": "recycle.svg",
"time": "time.svg", "time": "time.svg",

2
designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties

@ -7,6 +7,8 @@ ColorChooserUI=com.formdev.flatlaf.ui.FlatColorChooserUI
ComboBoxUI=com.fine.theme.light.ui.FineComboBoxUI ComboBoxUI=com.fine.theme.light.ui.FineComboBoxUI
DesktopIconUI=com.formdev.flatlaf.ui.FlatDesktopIconUI DesktopIconUI=com.formdev.flatlaf.ui.FlatDesktopIconUI
DesktopPaneUI=com.formdev.flatlaf.ui.FlatDesktopPaneUI 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 EditorPaneUI=com.formdev.flatlaf.ui.FlatEditorPaneUI
FileChooserUI=com.formdev.flatlaf.ui.FlatFileChooserUI FileChooserUI=com.formdev.flatlaf.ui.FlatFileChooserUI
FormattedTextFieldUI=com.formdev.flatlaf.ui.FlatFormattedTextFieldUI FormattedTextFieldUI=com.formdev.flatlaf.ui.FlatFormattedTextFieldUI

20
designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties

@ -410,6 +410,14 @@ Label.strongHintColor = #FF0000
Label.warningColor = #F1393C Label.warningColor = #F1393C
Label.secondaryColor = #0A1C38A8 Label.secondaryColor = #0A1C38A8
# ---- Calendar ----
Calendar.background = $fill.normal
Calendar.day.selectedBackground = #2576EF
Calendar.day.hoverBackground = #E6E9EF
Calendar.day.pressedBackground = #DADEE7
Calendar.dayOtherMonth.foreground = fade(@foreground, 29%)
Calendar.day.arc = 6
#---- HelpButton ---- #---- HelpButton ----
HelpButton.questionMarkColor = @accentCheckmarkColor HelpButton.questionMarkColor = @accentCheckmarkColor
@ -1401,8 +1409,16 @@ chart.selectedBorderColor = #2576EF
background: $fill.normal background: $fill.normal
[style]Button.originalButton = \ [style]Button.originalButton = \
border: 4,4,4,4; \ borderColor: null; \
background: null; background: $fill.normal; \
hoverBorderColor: null;
[style]Button.grayButton = \
foreground: fade(@foreground, 29%); \
borderColor: null; \
background: $fill.normal; \
hoverBorderColor: null;
[style]Label.detailLabel = \ [style]Label.detailLabel = \
foreground: fade(@foreground, 90%); \ foreground: fade(@foreground, 90%); \

32
designer-base/src/test/java/com/fr/design/gui/storybook/components/UICalendarPaneStoryBoard.java

@ -0,0 +1,32 @@
package com.fr.design.gui.storybook.components;
import com.fine.theme.light.ui.FineRoundBorder;
import com.fr.design.gui.date.UICalendarPanel;
import com.fr.design.gui.date.UIDatePicker;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.storybook.StoryBoard;
import javax.swing.*;
import java.awt.*;
import java.util.Date;
import static com.fine.swing.ui.layout.Layouts.*;
public class UICalendarPaneStoryBoard extends StoryBoard {
public UICalendarPaneStoryBoard() {
super("日期控件");
UICalendarPanel calendarPanel = new UICalendarPanel(true);
calendarPanel.setSelectedDate(new Date());
add(
cell(new UILabel("日期下拉框")).with(this::h3),
row(cell(new UIDatePicker(2)).with(this::setFixSize), flex()),
cell(new UILabel("日期")).with(this::h3),
row(cell(calendarPanel), flex())
);
}
private void setFixSize(JComponent component) {
component.setPreferredSize(new Dimension(240, component.getHeight()));
component.setBorder(new FineRoundBorder());
}
}
Loading…
Cancel
Save