826220679@qq.com
3 天以前 b518f895dec5264fd25e22a68300c40ceba6f43d
src/zhuye/buttonset.java
@@ -1,70 +1,116 @@
package zhuye;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.BorderFactory;
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 按钮背景色
     * @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);
        // 创建自定义绘制的按钮
        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.setBackground(baseColor);
        button.setForeground(Color.WHITE);
        button.setFocusPainted(false);
        button.setBorder(BorderFactory.createEmptyBorder(8, 18, 8, 18));
        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, DEFAULT_SIZE.width);
    int height = Math.max(preferred.height, DEFAULT_SIZE.height);
    Dimension adjustedSize = new Dimension(width, height);
    button.setPreferredSize(adjustedSize);
    button.setMinimumSize(new Dimension(DEFAULT_SIZE.width, DEFAULT_SIZE.height));
    button.setMaximumSize(adjustedSize);
        button.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseEntered(java.awt.event.MouseEvent event) {
                button.setBackground(brightenColor(baseColor));
            }
            @Override
            public void mouseExited(java.awt.event.MouseEvent event) {
                button.setBackground(baseColor);
            }
        });
        // 尺寸计算逻辑
        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;
    }
    private static Color brightenColor(Color color) {
        if (color == null) {
            return new Color(200, 200, 200);
        }
        int r = Math.min(255, color.getRed() + 30);
        int g = Math.min(255, color.getGreen() + 30);
        int b = Math.min(255, color.getBlue() + 30);
        return new Color(r, g, b);
    }
}
}