lemon
2 months ago
5 changed files with 150 additions and 106 deletions
@ -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(); |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue