张世豪
2025-12-12 4dd7a3a44f8c3d0bc658b8e3ac4ab84378551a55
修改了卫星状态图标
已添加1个文件
已修改7个文件
已删除1个文件
2046 ■■■■■ 文件已修改
GNGGA.txt 1821 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
image/gps0.png 补丁 | 查看 | 原始文档 | blame | 历史
image/gps1.png 补丁 | 查看 | 原始文档 | blame | 历史
image/gps2.png 补丁 | 查看 | 原始文档 | blame | 历史
image/gps4.png 补丁 | 查看 | 原始文档 | blame | 历史
image/gps5.png 补丁 | 查看 | 原始文档 | blame | 历史
set.properties 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/zhuye/Shouye.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/zhuye/gpszhuangtai.java 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
GNGGA.txt
ÎļþÒÑɾ³ý
image/gps0.png

image/gps1.png

image/gps2.png

image/gps4.png

image/gps5.png

set.properties
@@ -1,5 +1,5 @@
#Current work land selection updated
#Fri Dec 12 15:13:55 CST 2025
#Fri Dec 12 15:34:55 CST 2025
appVersion=-1
currentWorkLandNumber=LAND1
cuttingWidth=200
src/zhuye/Shouye.java
@@ -64,7 +64,7 @@
    private JLabel mowerSpeedValueLabel;
    private JLabel mowerSpeedUnitLabel;
    private JLabel mowingProgressLabel;
    private FixQualityIndicator fixQualityIndicator;
    private gpszhuangtai fixQualityIndicator;
    // å¯¼èˆªæŒ‰é’®
    private JButton homeNavBtn;
@@ -1497,7 +1497,7 @@
        JPanel rightPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 0));
        rightPanel.setOpaque(false);
        fixQualityIndicator = new FixQualityIndicator();
    fixQualityIndicator = new gpszhuangtai(THEME_COLOR);
        fixQualityIndicator.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        fixQualityIndicator.addMouseListener(new MouseAdapter() {
            @Override
@@ -3290,47 +3290,7 @@
        return !"未选择地块".equals(trimmed);
    }
    private final class FixQualityIndicator extends JComponent {
        private static final long serialVersionUID = 1L;
        private static final int DIAMETER = 16;
        private String currentCode;
        private Color currentColor = new Color(160, 160, 160);
        private FixQualityIndicator() {
            setPreferredSize(new Dimension(DIAMETER, DIAMETER));
            setMinimumSize(new Dimension(DIAMETER, DIAMETER));
            setMaximumSize(new Dimension(DIAMETER, DIAMETER));
            setToolTipText("未知");
        }
        private void setQuality(String code) {
            if (Objects.equals(currentCode, code)) {
                return;
            }
            currentCode = code;
            currentColor = resolveFixQualityColor(code);
            setToolTipText(resolveFixQualityDescription(code));
            repaint();
        }
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g.create();
            try {
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                int diameter = Math.min(getWidth(), getHeight()) - 2;
                int x = (getWidth() - diameter) / 2;
                int y = (getHeight() - diameter) / 2;
                g2.setColor(currentColor);
                g2.fillOval(x, y, diameter, diameter);
                g2.setColor(new Color(255, 255, 255, 128));
                g2.drawOval(x, y, diameter, diameter);
            } finally {
                g2.dispose();
            }
        }
    }
    // æµ‹è¯•方法
    public static void main(String[] args) {
src/zhuye/gpszhuangtai.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,179 @@
package zhuye;
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
 * ä½¿ç”¨å›¾ç‰‡è¡¨ç¤ºå‰²è‰æœºå«æ˜ŸçŠ¶æ€çš„å°ç»„ä»¶ã€‚
 * å½“定位状态为:0->image/gps0.png, 1->gps1.png, 2->gps2.png, 4->gps4.png, 5->gps5.png。
 * å…¶ä»–值使用 gps1.png。若图片未找到,回退为原有圆圈绘制。
 */
public class gpszhuangtai extends JComponent {
    private static final long serialVersionUID = 1L;
    private static final int ICON_SIZE =16;
    private String currentCode;
    private Color currentColor = new Color(160, 160, 160);
    private final Color themeColor;
    // å›¾ç‰‡ç¼“存,key ä¸ºæ–‡ä»¶åï¼ˆä¾‹å¦‚ "gps1.png")
    private final Map<String, Image> imageCache = new HashMap<>();
    private Image currentImage;
    public gpszhuangtai(Color themeColor) {
        this.themeColor = themeColor != null ? themeColor : new Color(46, 139, 87);
    setPreferredSize(new Dimension(ICON_SIZE, ICON_SIZE));
    setMinimumSize(new Dimension(ICON_SIZE, ICON_SIZE));
    setMaximumSize(new Dimension(ICON_SIZE, ICON_SIZE));
        setToolTipText("未知");
    }
    public void setQuality(String code) {
        if (Objects.equals(currentCode, code)) {
            return;
        }
        currentCode = code;
        currentColor = resolveFixQualityColor(code);
        setToolTipText(resolveFixQualityDescription(code));
        String filename = mapCodeToFilename(code);
        currentImage = loadImage(filename);
        // å§‹ç»ˆä½¿ç”¨é»˜è®¤å›¾æ ‡å°ºå¯¸ï¼Œä¸æ ¹æ®å›¾ç‰‡åŽŸå§‹å¤§å°æ”¹å˜ç»„ä»¶é¦–é€‰å°ºå¯¸
        setPreferredSize(new Dimension(ICON_SIZE, ICON_SIZE));
        repaint();
    }
    private String mapCodeToFilename(String code) {
        if (code == null) {
            return "gps1.png";
        }
        switch (code) {
            case "0":
                return "gps0.png";
            case "1":
                return "gps1.png";
            case "2":
                return "gps2.png";
            case "4":
                return "gps4.png";
            case "5":
                return "gps5.png";
            default:
                return "gps1.png";
        }
    }
    private Image loadImage(String filename) {
        if (filename == null) return null;
        if (imageCache.containsKey(filename)) {
            return imageCache.get(filename);
        }
        // é¦–先尝试从类路径加载(打包后可用)
        String path = "/image/" + filename;
        URL res = getClass().getResource(path);
        Image img = null;
        if (res != null) {
            img = new ImageIcon(res).getImage();
        } else {
            // å›žé€€åˆ°ç›¸å¯¹æ–‡ä»¶ç³»ç»Ÿè·¯å¾„(开发环境下)
            try {
                img = new ImageIcon("image/" + filename).getImage();
            } catch (Exception ignored) {
                img = null;
            }
        }
        imageCache.put(filename, img);
        return img;
    }
    private Color resolveFixQualityColor(String code) {
        if (code == null) {
            return new Color(160, 160, 160);
        }
        switch (code) {
            case "0":
                return new Color(160, 160, 160);
            case "1":
                return new Color(52, 152, 219);
            case "2":
                return new Color(26, 188, 156);
            case "3":
                return new Color(155, 89, 182);
            case "4":
                return themeColor;
            case "5":
                return new Color(241, 196, 15);
            case "6":
                return new Color(231, 76, 60);
            case "7":
                return new Color(230, 126, 34);
            default:
                return new Color(95, 95, 95);
        }
    }
    private String resolveFixQualityDescription(String code) {
        if (code == null) {
            return "未知";
        }
        switch (code) {
            case "0":
                return "未定位";
            case "1":
                return "单点定位";
            case "2":
                return "码差分";
            case "3":
                return "无效PPS";
            case "4":
                return "固定解";
            case "5":
                return "浮点解";
            case "6":
                return "正在估算";
            case "7":
                return "人工输入固定值";
            default:
                return "其他";
        }
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        try {
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            int w = getWidth();
            int h = getHeight();
            if (currentImage != null) {
                // å¼ºåˆ¶ä»¥ ICON_SIZE x ICON_SIZE ç»˜åˆ¶å›¾æ ‡å¹¶å±…中
                int drawW = ICON_SIZE;
                int drawH = ICON_SIZE;
                int x = (w - drawW) / 2;
                int y = (h - drawH) / 2;
                g2.drawImage(currentImage, x, y, drawW, drawH, null);
            } else {
                // å›žé€€ä¸ºåœ†åœˆç»˜åˆ¶ï¼Œä¿ç•™åŽŸæ ·é£Žæ ¼
                int diameter = Math.min(w, h) - 2;
                int x = (w - diameter) / 2;
                int y = (h - diameter) / 2;
                g2.setColor(currentColor);
                g2.fillOval(x, y, diameter, diameter);
                g2.setColor(new Color(255, 255, 255, 128));
                g2.drawOval(x, y, diameter, diameter);
            }
        } finally {
            g2.dispose();
        }
    }
}