| | |
| | | package zhuye; |
| | | |
| | | import java.awt.BasicStroke; |
| | | 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 width = Math.max(preferred.width + 20, 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 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); |
| | | } |
| | | } |