826220679@qq.com
2 天以前 48ee74129bb09a817a0bbbabe860c4007b74c66b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package publicway;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JButton;
import javax.swing.border.EmptyBorder;
 
/**
 * 提供统一按钮样式的工厂方法(美化版)。
 * 风格与 ObstacleManagementPage 保持一致:圆角、扁平化、抗锯齿。
 */
public final class buttonset {
    
    // 默认按钮尺寸
    private static final Dimension DEFAULT_SIZE = new Dimension(90, 36);
    // 圆角半径
    private static final int CORNER_RADIUS = 8;
 
    private buttonset() {
        // 工具类不需要实例化
    }
 
    /**
     * 创建带有现代化统一样式的按钮(圆角、扁平风格)。
     *
     * @param text 按钮显示文本
     * @param backgroundColor 按钮主色调(如果为null,默认使用灰蓝色)
     * @return 已应用样式的 JButton
     */
    public static JButton createStyledButton(String text, Color backgroundColor) {
        // 确定基础颜色,如果未指定则使用默认的钢蓝色
        final Color baseColor = backgroundColor != null ? backgroundColor : new Color(70, 130, 180);
 
        // 创建自定义绘制的按钮
        JButton button = new JButton(text) {
            private static final long serialVersionUID = 1L;
 
            @Override
            protected void paintComponent(Graphics g) {
                Graphics2D g2 = (Graphics2D) g.create();
                // 开启抗锯齿,使圆角和文字更平滑
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
 
                // 获取按钮状态
                boolean isPressed = getModel().isPressed();
                boolean isRollover = getModel().isRollover();
                int w = getWidth();
                int h = getHeight();
 
                // 计算当前背景色
                if (isPressed) {
                    g2.setColor(baseColor.darker()); // 按下变深
                } else if (isRollover) {
                    // 悬停时稍微透明或变亮,增加交互感
                    g2.setColor(new Color(baseColor.getRed(), baseColor.getGreen(), baseColor.getBlue(), 220)); 
                } else {
                    g2.setColor(baseColor); // 正常颜色
                }
 
                // 绘制圆角矩形背景
                g2.fill(new RoundRectangle2D.Double(0, 0, w, h, CORNER_RADIUS, CORNER_RADIUS));
 
                // 如果需要在按下时有轻微的边框效果(可选,增加立体感)
                if (isPressed) {
                    g2.setColor(new Color(0, 0, 0, 30));
                    g2.draw(new RoundRectangle2D.Double(0.5, 0.5, w - 1, h - 1, CORNER_RADIUS, CORNER_RADIUS));
                }
 
                // 绘制文字
                g2.setColor(Color.WHITE);
                g2.setFont(getFont());
                FontMetrics fm = g2.getFontMetrics();
                
                // 精确计算文字居中位置
                int textX = (w - fm.stringWidth(getText())) / 2;
                // 注意:y坐标是基线位置,需要加上 Ascent 并减去高度的一半
                int textY = (h - fm.getHeight()) / 2 + fm.getAscent();
                
                g2.drawString(getText(), textX, textY);
 
                g2.dispose();
            }
        };
 
        // 基础属性设置
        button.setFont(new Font("微软雅黑", Font.BOLD, 14));
        button.setForeground(Color.WHITE);
        button.setFocusPainted(false);      // 去除焦点虚线框
        button.setContentAreaFilled(false); // 去除默认背景绘制(由paintComponent接管)
        button.setBorderPainted(false);     // 去除默认边框
        button.setCursor(new Cursor(Cursor.HAND_CURSOR)); // 鼠标变成手型
        
        // 设置内边距(虽然主要由paintComponent控制,但对布局计算有帮助)
        button.setBorder(new EmptyBorder(8, 18, 8, 18));
 
        // 尺寸计算逻辑
        Dimension preferred = button.getPreferredSize();
        // 确保宽度不小于默认值,且根据文字长度自适应
        int width = Math.max(preferred.width + 20, DEFAULT_SIZE.width); 
        int height = Math.max(preferred.height, DEFAULT_SIZE.height);
        
        Dimension finalSize = new Dimension(width, height);
        button.setPreferredSize(finalSize);
        button.setMinimumSize(DEFAULT_SIZE);
        button.setMaximumSize(finalSize); // 防止在某些布局中被过度拉伸
 
        return button;
    }
}