张世豪
6 天以前 c498385fb7e372d13e2ee76d7b54ae2381728082
src/set/Sets.java
@@ -5,14 +5,12 @@
import zhuye.MapRenderer;
import zhuye.Shouye;
import zhuye.buttonset;
import set.Setsys;
import zhuye.celiangmoshi;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.RoundRectangle2D;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@@ -42,6 +40,7 @@
    private JLabel appVersionLabel;
    private JLabel idleTrailDurationLabel;
    private JLabel boundaryLengthVisibleLabel;
    private JLabel measurementModeEnabledLabel;
    
    private JButton mowerIdEditBtn;
    private JButton baseStationIdEditBtn;
@@ -156,6 +155,10 @@
        // 显示边界距离设置项
        JPanel boundaryLengthPanel = createBoundaryLengthPanel();
        boundaryLengthVisibleLabel = (JLabel) boundaryLengthPanel.getClientProperty("valueLabel");
        // 开启测量模式设置项
        JPanel measurementModePanel = createMeasurementModePanel();
        measurementModeEnabledLabel = (JLabel) measurementModePanel.getClientProperty("valueLabel");
        JPanel feedbackPanel = createFeedbackPanel();
        
@@ -171,6 +174,7 @@
        addSettingItem(panel, firmwarePanel, true);
        addSettingItem(panel, idleTrailPanel, true);
        addSettingItem(panel, boundaryLengthPanel, true);
        addSettingItem(panel, measurementModePanel, true);
        addSettingItem(panel, feedbackPanel, true);
        addSettingItem(panel, appVersionPanel, false);  // 最后一项不加分割线
        
@@ -384,6 +388,134 @@
    }
    
    /**
     * 创建开启测量模式设置面板
     */
    private JPanel createMeasurementModePanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        panel.setOpaque(false);  // 透明背景
        panel.setAlignmentX(Component.LEFT_ALIGNMENT);
        panel.setMaximumSize(new Dimension(Integer.MAX_VALUE, ROW_HEIGHT));
        panel.setPreferredSize(new Dimension(Integer.MAX_VALUE, ROW_HEIGHT));
        panel.setMinimumSize(new Dimension(0, ROW_HEIGHT));
        panel.setBorder(BorderFactory.createEmptyBorder(ITEM_PADDING, ITEM_PADDING, ITEM_PADDING, ITEM_PADDING));
        GridBagConstraints gbc = new GridBagConstraints();
        JLabel titleLabel = new JLabel("开启测量模式");
        titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 14));
        titleLabel.setForeground(Color.BLACK);
        titleLabel.setHorizontalAlignment(SwingConstants.RIGHT);
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 0;
        gbc.anchor = GridBagConstraints.EAST;
        gbc.insets = new Insets(0, 0, 0, 12);
        panel.add(titleLabel, gbc);
        measurementModeEnabledLabel = new JLabel(setData.isMeasurementModeEnabled() ? "已开启" : "已关闭");
        measurementModeEnabledLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        measurementModeEnabledLabel.setForeground(Color.DARK_GRAY);
        gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.anchor = GridBagConstraints.EAST;
        panel.add(measurementModeEnabledLabel, gbc);
        panel.putClientProperty("valueLabel", measurementModeEnabledLabel);
        // 创建切换按钮(使用图标)
        JButton toggleBtn = createMeasurementModeToggleButton();
        gbc = new GridBagConstraints();
        gbc.gridx = 2;
        gbc.gridy = 0;
        gbc.weightx = 0;
        gbc.anchor = GridBagConstraints.EAST;
        panel.add(toggleBtn, gbc);
        panel.putClientProperty("toggleButton", toggleBtn);
        return panel;
    }
    /**
     * 创建测量模式切换按钮
     */
    private JButton createMeasurementModeToggleButton() {
        JButton button = new JButton();
        button.setContentAreaFilled(false);
        button.setBorder(null);
        button.setFocusPainted(false);
        button.setCursor(new Cursor(Cursor.HAND_CURSOR));
        button.setPreferredSize(new Dimension(32, 32));
        button.setMinimumSize(new Dimension(32, 32));
        button.setMaximumSize(new Dimension(32, 32));
        updateMeasurementModeToggleButton(button);
        button.addActionListener(e -> toggleMeasurementMode(button));
        return button;
    }
    /**
     * 更新测量模式切换按钮图标
     */
    private void updateMeasurementModeToggleButton(JButton button) {
        boolean isEnabled = setData.isMeasurementModeEnabled();
        try {
            String iconPath = isEnabled ? "image/open.png" : "image/close.png";
            ImageIcon icon = new ImageIcon(iconPath);
            if (icon.getIconWidth() > 0) {
                Image scaledImage = icon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH);
                button.setIcon(new ImageIcon(scaledImage));
                button.setText(null);
            } else {
                button.setIcon(null);
                button.setText(isEnabled ? "开" : "关");
            }
        } catch (Exception e) {
            button.setIcon(null);
            button.setText(isEnabled ? "开" : "关");
            System.err.println("无法加载测量模式图标: " + e.getMessage());
        }
    }
    /**
     * 切换测量模式状态
     */
    private void toggleMeasurementMode(JButton button) {
        boolean newValue = !setData.isMeasurementModeEnabled();
        setData.setMeasurementModeEnabled(newValue);
        // 保存到配置文件
        setData.updateProperty("measurementModeEnabled", String.valueOf(newValue));
        // 更新UI
        if (measurementModeEnabledLabel != null) {
            measurementModeEnabledLabel.setText(newValue ? "已开启" : "已关闭");
        }
        updateMeasurementModeToggleButton(button);
        // 通知MapRenderer更新
        Shouye shouye = Shouye.getInstance();
        if (shouye != null) {
            MapRenderer renderer = shouye.getMapRenderer();
            if (renderer != null) {
                renderer.setMeasurementMode(newValue);
            }
            if (newValue) {
                celiangmoshi.start();
            } else {
                celiangmoshi.stop();
            }
            // 刷新地图显示(通过MapRenderer触发重绘)
            if (renderer != null) {
                renderer.repaint();
            }
        }
    }
    /**
     * 创建边界距离显示切换按钮
     */
    private JButton createBoundaryLengthToggleButton() {
@@ -580,6 +712,19 @@
            }
        }
        
        // 更新测量模式状态
        if (measurementModeEnabledLabel != null) {
            measurementModeEnabledLabel.setText(setData.isMeasurementModeEnabled() ? "已开启" : "已关闭");
        }
        // 更新测量模式切换按钮图标
        JPanel measurementModePanel = (JPanel) measurementModeEnabledLabel.getParent();
        if (measurementModePanel != null) {
            JButton toggleBtn = (JButton) measurementModePanel.getClientProperty("toggleButton");
            if (toggleBtn != null) {
                updateMeasurementModeToggleButton(toggleBtn);
            }
        }
        // 更新APP版本显示
        if (appVersionLabel != null) {
            appVersionLabel.setText(setData.getAppVersion() != null ?