From 48ee74129bb09a817a0bbbabe860c4007b74c66b Mon Sep 17 00:00:00 2001
From: 826220679@qq.com <826220679@qq.com>
Date: 星期日, 21 十二月 2025 12:37:44 +0800
Subject: [PATCH] 新增了往返路径
---
src/set/Sets.java | 1312 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 1,229 insertions(+), 83 deletions(-)
diff --git a/src/set/Sets.java b/src/set/Sets.java
index a5e2863..ab09098 100644
--- a/src/set/Sets.java
+++ b/src/set/Sets.java
@@ -1,46 +1,71 @@
package set;
+
+import baseStation.BaseStation;
+import gecaoji.Device;
+import gecaoji.MowerSafetyDistanceCalculator;
+import publicway.buttonset;
+import zhuye.MapRenderer;
+import zhuye.Shouye;
+import zhuye.celiangmoshi;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.*;
+import java.awt.geom.Point2D;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
/**
* 璁剧疆瀵硅瘽妗� - 鍙傝�僑houye.java鏍峰紡
*/
public class Sets extends JDialog {
private static final long serialVersionUID = 1L;
- private static final int ROW_HEIGHT = 40;
- private static final int ROW_SPACING = 25;
+ private static final int ROW_HEIGHT = 50; // 澧炲姞琛岄珮浠ラ�傚簲鍒嗗壊绾�
+ private static final int ITEM_PADDING = 16; // 鍒楄〃椤瑰唴杈硅窛
// 涓婚棰滆壊
private final Color THEME_COLOR;
- private final Color BACKGROUND_COLOR = new Color(250, 250, 250);
- private final Color PANEL_BACKGROUND = new Color(255, 255, 255);
- private final Color BORDER_COLOR = new Color(220, 220, 220);
+ private final Color BACKGROUND_COLOR = new Color(245, 247, 250); // 鏇存煍鍜岀殑娴呯伆鑹茶儗鏅�
+ private final Color PANEL_BACKGROUND = new Color(255, 255, 255); // 鐧借壊闈㈡澘
+ private final Color BORDER_COLOR = new Color(233, 236, 239); // 娴呰竟妗嗚壊
+ private final Color DIVIDER_COLOR = new Color(233, 236, 239); // 鍒嗗壊绾块鑹�
// 璁剧疆椤圭粍浠�
private JLabel mowerIdLabel;
+ private JLabel mowerSizeLabel;
+ private JLabel mowingSafetyDistanceLabel;
+ private JLabel baseStationIdLabel;
private JLabel handheldMarkerLabel;
private JLabel simCardNumberLabel;
+ private JLabel baseStationSimLabel;
private JLabel firmwareVersionLabel;
private JLabel appVersionLabel;
+ private JLabel idleTrailDurationLabel;
+ private JLabel boundaryLengthVisibleLabel;
+ private JLabel measurementModeEnabledLabel;
+ private JLabel manualBoundaryDrawingModeLabel;
private JButton mowerIdEditBtn;
+ private JButton mowerSizeEditBtn;
+ private JButton mowingSafetyDistanceEditBtn;
+ private JButton baseStationIdEditBtn;
private JButton handheldEditBtn;
private JButton checkUpdateBtn;
private JButton feedbackButton;
+ private JButton idleTrailEditBtn;
// 鏁版嵁妯″瀷
private Setsys setData;
+ private final BaseStation baseStation;
public Sets(JFrame parent, Color themeColor) {
super(parent, "绯荤粺璁剧疆", true);
this.THEME_COLOR = themeColor;
this.setData = new Setsys();
+ this.baseStation = new BaseStation();
initializeUI();
loadData();
}
@@ -49,6 +74,7 @@
super(parent, "绯荤粺璁剧疆", true);
this.THEME_COLOR = themeColor;
this.setData = new Setsys();
+ this.baseStation = new BaseStation();
initializeUI();
loadData();
}
@@ -62,36 +88,65 @@
setLocationRelativeTo(getParent());
setResizable(false);
- // 鍒涘缓涓诲唴瀹归潰鏉�
+ // 鍒涘缓涓诲唴瀹归潰鏉匡紙浣跨敤鏇存煍鍜岀殑娴呯伆鑹茶儗鏅級
JPanel mainPanel = new JPanel();
- mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
+ mainPanel.setLayout(new BorderLayout());
mainPanel.setBackground(BACKGROUND_COLOR);
mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
- // 鍒涘缓璁剧疆椤归潰鏉�
+ // 鍒涘缓璁剧疆椤归潰鏉匡紙鍦嗚鐧借壊闈㈡澘锛�
JPanel settingsPanel = createSettingsPanel();
// 娣诲姞缁勪欢鍒颁富闈㈡澘
- mainPanel.add(settingsPanel);
- mainPanel.add(Box.createVerticalGlue());
+ mainPanel.add(settingsPanel, BorderLayout.CENTER);
add(mainPanel, BorderLayout.CENTER);
}
private JPanel createSettingsPanel() {
+ // 鍒涘缓鍦嗚鐧借壊闈㈡澘瀹瑰櫒
+ JPanel container = new JPanel() {
+ @Override
+ protected void paintComponent(Graphics g) {
+ Graphics2D g2d = (Graphics2D) g.create();
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ g2d.setColor(PANEL_BACKGROUND);
+ // 缁樺埗鍦嗚鐭╁舰鑳屾櫙
+ g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 16, 16);
+ g2d.dispose();
+ }
+ };
+ container.setLayout(new BorderLayout());
+ container.setOpaque(false);
+
+ // 鍐呭闈㈡澘
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
- panel.setBackground(PANEL_BACKGROUND);
- panel.setBorder(BorderFactory.createCompoundBorder(
- BorderFactory.createLineBorder(BORDER_COLOR),
- BorderFactory.createEmptyBorder(20, 20, 20, 20)
- ));
+ panel.setOpaque(false);
+ panel.setBorder(BorderFactory.createEmptyBorder(8, 0, 8, 0));
// 鍓茶崏鏈虹紪鍙�
JPanel mowerIdPanel = createSettingItemPanel("鍓茶崏鏈虹紪鍙�",
setData.getMowerId() != null ? setData.getMowerId() : "鏈缃�", true);
mowerIdLabel = (JLabel) mowerIdPanel.getClientProperty("valueLabel");
mowerIdEditBtn = (JButton) mowerIdPanel.getClientProperty("editButton");
+
+ // 鍓茶崏鏈洪暱瀹�
+ JPanel mowerSizePanel = createSettingItemPanel("鍓茶崏鏈洪暱瀹�",
+ formatMowerSize(), true);
+ mowerSizeLabel = (JLabel) mowerSizePanel.getClientProperty("valueLabel");
+ mowerSizeEditBtn = (JButton) mowerSizePanel.getClientProperty("editButton");
+
+ // 鍓茶崏瀹夊叏璺濈
+ JPanel mowingSafetyDistancePanel = createSettingItemPanel("鍓茶崏瀹夊叏璺濈",
+ formatMowingSafetyDistance(), true);
+ mowingSafetyDistanceLabel = (JLabel) mowingSafetyDistancePanel.getClientProperty("valueLabel");
+ mowingSafetyDistanceEditBtn = (JButton) mowingSafetyDistancePanel.getClientProperty("editButton");
+
+ JPanel baseStationIdPanel = createSettingItemPanel("宸垎鍩哄噯绔欑紪鍙�",
+ resolveBaseStationId(), true);
+ baseStationIdLabel = (JLabel) baseStationIdPanel.getClientProperty("valueLabel");
+ baseStationIdEditBtn = (JButton) baseStationIdPanel.getClientProperty("editButton");
JPanel handheldPanel = createSettingItemPanel("渚挎惡鎵撶偣鍣ㄧ紪鍙�",
setData.getHandheldMarkerId() != null ? setData.getHandheldMarkerId() : "鏈缃�", true);
@@ -99,42 +154,154 @@
handheldEditBtn = (JButton) handheldPanel.getClientProperty("editButton");
// 鐗╄仈鍗″彿
- JPanel simCardPanel = createSettingItemPanel("鐗╄仈鍗″彿",
+ JPanel simCardPanel = createSettingItemPanel("鍓茶崏鏈虹墿鑱旂綉鍗″彿",
setData.getSimCardNumber() != null ? setData.getSimCardNumber() : "鏈缃�", false);
simCardNumberLabel = (JLabel) simCardPanel.getClientProperty("valueLabel");
+
+ JPanel baseStationSimPanel = createSettingItemPanel("鍩哄噯绔欑墿鑱旂綉鍗″彿",
+ resolveBaseStationSimCard(), false);
+ baseStationSimLabel = (JLabel) baseStationSimPanel.getClientProperty("valueLabel");
// 鍥轰欢鐗堟湰
JPanel firmwarePanel = createSettingItemPanel("鍥轰欢鐗堟湰",
setData.getFirmwareVersion() != null ? setData.getFirmwareVersion() : "鏈缃�", false);
firmwareVersionLabel = (JLabel) firmwarePanel.getClientProperty("valueLabel");
+ JPanel idleTrailPanel = createSettingItemPanel("杞ㄨ抗鎷栧熬鏃堕暱",
+ formatIdleTrailDurationValue(), true);
+ idleTrailDurationLabel = (JLabel) idleTrailPanel.getClientProperty("valueLabel");
+ idleTrailEditBtn = (JButton) idleTrailPanel.getClientProperty("editButton");
+
+ // 鏄剧ず杈圭晫璺濈璁剧疆椤�
+ JPanel boundaryLengthPanel = createBoundaryLengthPanel();
+ boundaryLengthVisibleLabel = (JLabel) boundaryLengthPanel.getClientProperty("valueLabel");
+
+ // 寮�鍚祴閲忔ā寮忚缃」
+ JPanel measurementModePanel = createMeasurementModePanel();
+ measurementModeEnabledLabel = (JLabel) measurementModePanel.getClientProperty("valueLabel");
+
+ // 鎵嬪姩缁樺埗杈圭晫妯″紡璁剧疆椤�
+ JPanel manualBoundaryDrawingPanel = createManualBoundaryDrawingPanel();
+ manualBoundaryDrawingModeLabel = (JLabel) manualBoundaryDrawingPanel.getClientProperty("valueLabel");
+
JPanel feedbackPanel = createFeedbackPanel();
// APP鐗堟湰
JPanel appVersionPanel = createAppVersionPanel();
- addRowWithSpacing(panel, mowerIdPanel);
- addRowWithSpacing(panel, handheldPanel);
- addRowWithSpacing(panel, simCardPanel);
- addRowWithSpacing(panel, firmwarePanel);
- addRowWithSpacing(panel, feedbackPanel);
- panel.add(appVersionPanel);
+ // 娣诲姞璁剧疆椤癸紝浣跨敤鍒嗗壊绾垮垎闅�
+ addSettingItem(panel, mowerIdPanel, true);
+ addSettingItem(panel, mowerSizePanel, true);
+ addSettingItem(panel, mowingSafetyDistancePanel, true);
+ addSettingItem(panel, baseStationIdPanel, true);
+ addSettingItem(panel, handheldPanel, true);
+ addSettingItem(panel, simCardPanel, true);
+ addSettingItem(panel, baseStationSimPanel, true);
+ addSettingItem(panel, firmwarePanel, true);
+ addSettingItem(panel, idleTrailPanel, true);
+ addSettingItem(panel, boundaryLengthPanel, true);
+ addSettingItem(panel, measurementModePanel, true);
+ addSettingItem(panel, manualBoundaryDrawingPanel, true);
+ addSettingItem(panel, feedbackPanel, true);
+ addSettingItem(panel, appVersionPanel, false); // 鏈�鍚庝竴椤逛笉鍔犲垎鍓茬嚎
- return panel;
+ container.add(panel, BorderLayout.CENTER);
+ return container;
+ }
+
+ /**
+ * 娣诲姞璁剧疆椤癸紙甯﹀垎鍓茬嚎锛�
+ */
+ private void addSettingItem(JPanel container, JPanel itemPanel, boolean showDivider) {
+ container.add(itemPanel);
+ if (showDivider) {
+ // 娣诲姞鍒嗗壊绾�
+ JSeparator divider = new JSeparator();
+ divider.setForeground(DIVIDER_COLOR);
+ divider.setMaximumSize(new Dimension(Integer.MAX_VALUE, 1));
+ divider.setAlignmentX(Component.LEFT_ALIGNMENT);
+ container.add(divider);
+ }
}
- private void addRowWithSpacing(JPanel container, JPanel row) {
- container.add(row);
- container.add(Box.createRigidArea(new Dimension(0, ROW_SPACING)));
+ private String formatIdleTrailDurationValue() {
+ int seconds = setData != null ? setData.getIdleTrailDurationSeconds() : Setsys.DEFAULT_IDLE_TRAIL_DURATION_SECONDS;
+ if (seconds <= 0) {
+ seconds = Setsys.DEFAULT_IDLE_TRAIL_DURATION_SECONDS;
+ }
+ return seconds + "绉�";
}
+
+ /**
+ * 灏嗗瓧绗︿覆鍊艰浆鎹负绫筹紙鍏煎鏃ф暟鎹紝濡傛灉鍊煎ぇ浜�100璁や负鏄帢绫筹紝闇�瑕侀櫎浠�100锛�
+ */
+ private double convertToMeters(String value) {
+ if (value == null || value.trim().isEmpty() || "-1".equals(value.trim())) {
+ return -1;
+ }
+ try {
+ double val = Double.parseDouble(value.trim());
+ // 濡傛灉鍊煎ぇ浜�100锛岃涓烘槸鍘樼背锛岄渶瑕佽浆鎹负绫�
+ if (val > 100) {
+ return val / 100.0;
+ }
+ return val;
+ } catch (NumberFormatException e) {
+ return -1;
+ }
+ }
+
+ /**
+ * 鏍煎紡鍖栨暟鍊间负绫筹紝淇濈暀2浣嶅皬鏁�
+ */
+ private String formatMeters(double value) {
+ if (value < 0) {
+ return "鏈缃�";
+ }
+ return String.format("%.2f", value) + "m";
+ }
+
+ private String formatMowerSize() {
+ Device device = Device.getActiveDevice();
+ if (device == null) {
+ return "鏈缃�";
+ }
+ String width = device.getMowerWidth();
+ String length = device.getMowerLength();
+ double widthMeters = convertToMeters(width);
+ double lengthMeters = convertToMeters(length);
+
+ if (widthMeters < 0 && lengthMeters < 0) {
+ return "鏈缃�";
+ }
+
+ String widthStr = widthMeters >= 0 ? formatMeters(widthMeters) : "鏈缃�";
+ String lengthStr = lengthMeters >= 0 ? formatMeters(lengthMeters) : "鏈缃�";
+ return lengthStr + " 脳 " + widthStr;
+ }
+
+ private String formatMowingSafetyDistance() {
+ Device device = Device.getActiveDevice();
+ if (device == null) {
+ return "鏈缃�";
+ }
+ String distance = device.getMowingSafetyDistance();
+ double distanceMeters = convertToMeters(distance);
+ if (distanceMeters < 0) {
+ return "鏈缃�";
+ }
+ return formatMeters(distanceMeters);
+ }
+
private JPanel createSettingItemPanel(String title, String value, boolean editable) {
JPanel panel = new JPanel(new GridBagLayout());
- panel.setBackground(PANEL_BACKGROUND);
+ 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();
@@ -180,11 +347,12 @@
private JPanel createAppVersionPanel() {
JPanel panel = new JPanel(new GridBagLayout());
- panel.setBackground(PANEL_BACKGROUND);
+ 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();
@@ -209,28 +377,8 @@
gbc.anchor = GridBagConstraints.EAST;
panel.add(appVersionLabel, gbc);
- checkUpdateBtn = new JButton("妫�鏌ユ洿鏂�");
+ checkUpdateBtn = buttonset.createStyledButton("妫�鏌ユ洿鏂�", THEME_COLOR);
checkUpdateBtn.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 12));
- checkUpdateBtn.setBackground(THEME_COLOR);
- checkUpdateBtn.setForeground(Color.WHITE);
- checkUpdateBtn.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 12));
- checkUpdateBtn.setPreferredSize(new Dimension(90, 25));
- checkUpdateBtn.setMinimumSize(new Dimension(90, 25));
- checkUpdateBtn.setMaximumSize(new Dimension(90, 25));
- checkUpdateBtn.setFocusPainted(false);
-
- checkUpdateBtn.addMouseListener(new MouseAdapter() {
- public void mouseEntered(MouseEvent e) {
- checkUpdateBtn.setBackground(new Color(
- Math.max(THEME_COLOR.getRed() - 20, 0),
- Math.max(THEME_COLOR.getGreen() - 20, 0),
- Math.max(THEME_COLOR.getBlue() - 20, 0)
- ));
- }
- public void mouseExited(MouseEvent e) {
- checkUpdateBtn.setBackground(THEME_COLOR);
- }
- });
gbc = new GridBagConstraints();
gbc.gridx = 2;
@@ -244,11 +392,12 @@
private JPanel createFeedbackPanel() {
JPanel panel = new JPanel(new GridBagLayout());
- panel.setBackground(PANEL_BACKGROUND);
+ 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();
@@ -263,30 +412,8 @@
gbc.insets = new Insets(0, 0, 0, 12);
panel.add(titleLabel, gbc);
- feedbackButton = new JButton("鍙嶉");
+ feedbackButton = buttonset.createStyledButton("鍙嶉", THEME_COLOR);
feedbackButton.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 12));
- feedbackButton.setBackground(THEME_COLOR);
- feedbackButton.setForeground(Color.WHITE);
- feedbackButton.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20));
- feedbackButton.setPreferredSize(new Dimension(100, 28));
- feedbackButton.setMinimumSize(new Dimension(100, 28));
- feedbackButton.setMaximumSize(new Dimension(100, 28));
- feedbackButton.setFocusPainted(false);
-
- feedbackButton.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseEntered(MouseEvent e) {
- feedbackButton.setBackground(new Color(
- Math.max(THEME_COLOR.getRed() - 20, 0),
- Math.max(THEME_COLOR.getGreen() - 20, 0),
- Math.max(THEME_COLOR.getBlue() - 20, 0)));
- }
-
- @Override
- public void mouseExited(MouseEvent e) {
- feedbackButton.setBackground(THEME_COLOR);
- }
- });
gbc = new GridBagConstraints();
gbc.gridx = 1;
@@ -298,6 +425,424 @@
return panel;
}
+ /**
+ * 鍒涘缓鏄剧ず杈圭晫璺濈璁剧疆闈㈡澘
+ */
+ private JPanel createBoundaryLengthPanel() {
+ 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);
+
+ boundaryLengthVisibleLabel = new JLabel(setData.isBoundaryLengthVisible() ? "宸插紑鍚�" : "宸插叧闂�");
+ boundaryLengthVisibleLabel.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 14));
+ boundaryLengthVisibleLabel.setForeground(Color.DARK_GRAY);
+ gbc = new GridBagConstraints();
+ gbc.gridx = 1;
+ gbc.gridy = 0;
+ gbc.weightx = 1.0;
+ gbc.anchor = GridBagConstraints.EAST;
+ panel.add(boundaryLengthVisibleLabel, gbc);
+
+ panel.putClientProperty("valueLabel", boundaryLengthVisibleLabel);
+
+ // 鍒涘缓鍒囨崲鎸夐挳锛堜娇鐢ㄥ浘鏍囷級
+ JButton toggleBtn = createBoundaryLengthToggleButton();
+ 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 JPanel createManualBoundaryDrawingPanel() {
+ 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);
+ titleLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
+ // 娣诲姞鐐瑰嚮浜嬩欢锛屾樉绀哄潗鏍囧璇濇
+ titleLabel.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ showManualBoundaryCoordinatesDialog();
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ titleLabel.setForeground(THEME_COLOR);
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ titleLabel.setForeground(Color.BLACK);
+ }
+ });
+ 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);
+
+ manualBoundaryDrawingModeLabel = new JLabel(setData.isManualBoundaryDrawingMode() ? "宸插紑鍚�" : "宸插叧闂�");
+ manualBoundaryDrawingModeLabel.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 14));
+ manualBoundaryDrawingModeLabel.setForeground(Color.DARK_GRAY);
+ gbc = new GridBagConstraints();
+ gbc.gridx = 1;
+ gbc.gridy = 0;
+ gbc.weightx = 1.0;
+ gbc.anchor = GridBagConstraints.EAST;
+ panel.add(manualBoundaryDrawingModeLabel, gbc);
+
+ panel.putClientProperty("valueLabel", manualBoundaryDrawingModeLabel);
+
+ // 鍒涘缓鍒囨崲鎸夐挳锛堜娇鐢ㄥ浘鏍囷級
+ JButton toggleBtn = createManualBoundaryDrawingToggleButton();
+ 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 createManualBoundaryDrawingToggleButton() {
+ 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));
+
+ updateManualBoundaryDrawingToggleButton(button);
+
+ button.addActionListener(e -> toggleManualBoundaryDrawingMode(button));
+
+ return button;
+ }
+
+ /**
+ * 鏇存柊鎵嬪姩缁樺埗杈圭晫妯″紡鍒囨崲鎸夐挳鍥炬爣
+ */
+ private void updateManualBoundaryDrawingToggleButton(JButton button) {
+ boolean isEnabled = setData.isManualBoundaryDrawingMode();
+ 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 toggleManualBoundaryDrawingMode(JButton button) {
+ boolean newValue = !setData.isManualBoundaryDrawingMode();
+ setData.setManualBoundaryDrawingMode(newValue);
+
+ // 淇濆瓨鍒伴厤缃枃浠�
+ setData.updateProperty("manualBoundaryDrawingMode", String.valueOf(newValue));
+
+ // 鏇存柊UI
+ if (manualBoundaryDrawingModeLabel != null) {
+ manualBoundaryDrawingModeLabel.setText(newValue ? "宸插紑鍚�" : "宸插叧闂�");
+ }
+ updateManualBoundaryDrawingToggleButton(button);
+
+ // 閫氱煡MapRenderer鏇存柊鎵嬪姩缁樺埗杈圭晫妯″紡鐘舵��
+ Shouye shouye = Shouye.getInstance();
+ if (shouye != null) {
+ MapRenderer renderer = shouye.getMapRenderer();
+ if (renderer != null) {
+ renderer.setManualBoundaryDrawingMode(newValue);
+ if (!newValue) {
+ // 濡傛灉鍏抽棴妯″紡锛屾竻绌哄凡缁樺埗鐨勭偣
+ renderer.clearManualBoundaryPoints();
+ }
+ }
+ // 閫氱煡棣栭〉鏇存柊鎮诞杩斿洖鎸夐挳鏄剧ず鐘舵��
+ shouye.updateSettingsReturnButtonVisibility();
+ }
+
+ // 濡傛灉寮�鍚紝鍏抽棴绯荤粺璁剧疆椤甸潰骞惰繑鍥為椤�
+ if (newValue) {
+ SwingUtilities.invokeLater(() -> {
+ setVisible(false);
+ dispose();
+ });
+ }
+ }
+
+ /**
+ * 鍒涘缓寮�鍚祴閲忔ā寮忚缃潰鏉�
+ */
+ 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();
+ }
+ // 閫氱煡棣栭〉鏇存柊鎮诞杩斿洖鎸夐挳鏄剧ず鐘舵��
+ shouye.updateSettingsReturnButtonVisibility();
+ }
+
+ // 濡傛灉寮�鍚紝鍏抽棴绯荤粺璁剧疆椤甸潰骞惰繑鍥為椤�
+ if (newValue) {
+ SwingUtilities.invokeLater(() -> {
+ setVisible(false);
+ dispose();
+ });
+ }
+ }
+
+ /**
+ * 鍒涘缓杈圭晫璺濈鏄剧ず鍒囨崲鎸夐挳
+ */
+ private JButton createBoundaryLengthToggleButton() {
+ 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));
+
+ updateBoundaryLengthToggleButton(button);
+
+ button.addActionListener(e -> toggleBoundaryLengthVisible(button));
+
+ return button;
+ }
+
+ /**
+ * 鏇存柊杈圭晫璺濈鍒囨崲鎸夐挳鍥炬爣
+ */
+ private void updateBoundaryLengthToggleButton(JButton button) {
+ boolean isVisible = setData.isBoundaryLengthVisible();
+ try {
+ String iconPath = isVisible ? "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(isVisible ? "寮�" : "鍏�");
+ }
+ } catch (Exception e) {
+ button.setIcon(null);
+ button.setText(isVisible ? "寮�" : "鍏�");
+ System.err.println("鏃犳硶鍔犺浇杈圭晫璺濈鍥炬爣: " + e.getMessage());
+ }
+ }
+
+ /**
+ * 鍒囨崲杈圭晫璺濈鏄剧ず鐘舵��
+ */
+ private void toggleBoundaryLengthVisible(JButton button) {
+ boolean newValue = !setData.isBoundaryLengthVisible();
+ setData.setBoundaryLengthVisible(newValue);
+
+ // 淇濆瓨鍒伴厤缃枃浠�
+ setData.updateProperty("boundaryLengthVisible", String.valueOf(newValue));
+
+ // 鏇存柊UI
+ if (boundaryLengthVisibleLabel != null) {
+ boundaryLengthVisibleLabel.setText(newValue ? "宸插紑鍚�" : "宸插叧闂�");
+ }
+ updateBoundaryLengthToggleButton(button);
+
+ // 閫氱煡MapRenderer鏇存柊
+ Shouye shouye = Shouye.getInstance();
+ if (shouye != null) {
+ MapRenderer renderer = shouye.getMapRenderer();
+ if (renderer != null) {
+ renderer.setBoundaryLengthVisible(newValue);
+ }
+ // 閫氱煡棣栭〉鏇存柊鎮诞杩斿洖鎸夐挳鏄剧ず鐘舵��
+ shouye.updateSettingsReturnButtonVisibility();
+ }
+
+ // 濡傛灉寮�鍚紝鍏抽棴绯荤粺璁剧疆椤甸潰骞惰繑鍥為椤�
+ if (newValue) {
+ SwingUtilities.invokeLater(() -> {
+ setVisible(false);
+ dispose();
+ });
+ }
+ }
+
private JButton createEditButton() {
JButton button = new JButton();
try {
@@ -333,7 +878,55 @@
private void loadData() {
// 浠嶴etsys绫诲姞杞芥暟鎹�
setData.initializeFromProperties();
+ baseStation.load();
+ // 浠巇evice.properties鍔犺浇璁惧鏁版嵁
+ Device device = Device.getActiveDevice();
+ if (device != null) {
+ device.initFromProperties();
+ }
updateDisplay();
+ // 鍔犺浇骞跺簲鐢ㄤ笂娆′繚瀛樼殑瑙嗗浘涓績鍧愭爣
+ loadViewCenterFromProperties();
+ }
+
+ /**
+ * 浠庨厤缃枃浠跺姞杞借鍥句腑蹇冨潗鏍囧苟搴旂敤鍒癕apRenderer
+ */
+ private void loadViewCenterFromProperties() {
+ Shouye shouye = Shouye.getInstance();
+ if (shouye == null) {
+ return;
+ }
+ MapRenderer renderer = shouye.getMapRenderer();
+ if (renderer == null) {
+ return;
+ }
+
+ // 浠庨厤缃枃浠惰鍙栬鍥句腑蹇冨潗鏍�
+ String viewCenterXValue = Setsys.getPropertyValue("viewCenterX");
+ String viewCenterYValue = Setsys.getPropertyValue("viewCenterY");
+
+ double savedTranslateX = 0.0;
+ double savedTranslateY = 0.0;
+
+ if (viewCenterXValue != null && !viewCenterXValue.trim().isEmpty()) {
+ try {
+ savedTranslateX = Double.parseDouble(viewCenterXValue.trim());
+ } catch (NumberFormatException e) {
+ savedTranslateX = 0.0;
+ }
+ }
+ if (viewCenterYValue != null && !viewCenterYValue.trim().isEmpty()) {
+ try {
+ savedTranslateY = Double.parseDouble(viewCenterYValue.trim());
+ } catch (NumberFormatException e) {
+ savedTranslateY = 0.0;
+ }
+ }
+
+ // 搴旂敤瑙嗗浘涓績鍧愭爣锛堜繚鎸佸綋鍓嶇缉鏀炬瘮渚嬶級
+ double currentScale = renderer.getScale();
+ renderer.setViewTransform(currentScale, savedTranslateX, savedTranslateY);
}
private void updateDisplay() {
@@ -342,6 +935,20 @@
mowerIdLabel.setText(setData.getMowerId() != null ? setData.getMowerId() : "鏈缃�");
}
+ // 鏇存柊鍓茶崏鏈洪暱瀹芥樉绀�
+ if (mowerSizeLabel != null) {
+ mowerSizeLabel.setText(formatMowerSize());
+ }
+
+ // 鏇存柊鍓茶崏瀹夊叏璺濈鏄剧ず
+ if (mowingSafetyDistanceLabel != null) {
+ mowingSafetyDistanceLabel.setText(formatMowingSafetyDistance());
+ }
+
+ if (baseStationIdLabel != null) {
+ baseStationIdLabel.setText(resolveBaseStationId());
+ }
+
if (handheldMarkerLabel != null) {
handheldMarkerLabel.setText(setData.getHandheldMarkerId() != null ? setData.getHandheldMarkerId() : "鏈缃�");
}
@@ -351,12 +958,59 @@
simCardNumberLabel.setText(setData.getSimCardNumber() != null ?
setData.getSimCardNumber() : "鏈缃�");
}
+
+ if (baseStationSimLabel != null) {
+ baseStationSimLabel.setText(resolveBaseStationSimCard());
+ }
// 鏇存柊鍥轰欢鐗堟湰鏄剧ず
if (firmwareVersionLabel != null) {
firmwareVersionLabel.setText(setData.getFirmwareVersion() != null ?
setData.getFirmwareVersion() : "鏈缃�");
}
+
+ if (idleTrailDurationLabel != null) {
+ idleTrailDurationLabel.setText(formatIdleTrailDurationValue());
+ }
+
+ // 鏇存柊鏄剧ず杈圭晫璺濈鐘舵��
+ if (boundaryLengthVisibleLabel != null) {
+ boundaryLengthVisibleLabel.setText(setData.isBoundaryLengthVisible() ? "宸插紑鍚�" : "宸插叧闂�");
+ }
+ // 鏇存柊鍒囨崲鎸夐挳鍥炬爣
+ JPanel boundaryLengthPanel = (JPanel) boundaryLengthVisibleLabel.getParent();
+ if (boundaryLengthPanel != null) {
+ JButton toggleBtn = (JButton) boundaryLengthPanel.getClientProperty("toggleButton");
+ if (toggleBtn != null) {
+ updateBoundaryLengthToggleButton(toggleBtn);
+ }
+ }
+
+ // 鏇存柊娴嬮噺妯″紡鐘舵��
+ 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);
+ }
+ }
+
+ // 鏇存柊鎵嬪姩缁樺埗杈圭晫妯″紡鐘舵��
+ if (manualBoundaryDrawingModeLabel != null) {
+ manualBoundaryDrawingModeLabel.setText(setData.isManualBoundaryDrawingMode() ? "宸插紑鍚�" : "宸插叧闂�");
+ }
+ // 鏇存柊鎵嬪姩缁樺埗杈圭晫妯″紡鍒囨崲鎸夐挳鍥炬爣
+ JPanel manualBoundaryDrawingPanel = (JPanel) manualBoundaryDrawingModeLabel.getParent();
+ if (manualBoundaryDrawingPanel != null) {
+ JButton toggleBtn = (JButton) manualBoundaryDrawingPanel.getClientProperty("toggleButton");
+ if (toggleBtn != null) {
+ updateManualBoundaryDrawingToggleButton(toggleBtn);
+ }
+ }
// 鏇存柊APP鐗堟湰鏄剧ず
if (appVersionLabel != null) {
@@ -364,12 +1018,56 @@
setData.getAppVersion() : "鏈缃�");
}
}
+
+ private String resolveBaseStationSimCard() {
+ if (baseStation == null) {
+ return "鏈缃�";
+ }
+ String value = baseStation.getIotSimCardNumber();
+ if (value == null) {
+ return "鏈缃�";
+ }
+ String trimmed = value.trim();
+ if (trimmed.isEmpty() || "-1".equals(trimmed)) {
+ return "鏈缃�";
+ }
+ return trimmed;
+ }
+
+ private String resolveBaseStationId() {
+ if (baseStation == null) {
+ return "鏈缃�";
+ }
+ String value = baseStation.getDeviceId();
+ if (value == null) {
+ return "鏈缃�";
+ }
+ String trimmed = value.trim();
+ if (trimmed.isEmpty() || "-1".equals(trimmed)) {
+ return "鏈缃�";
+ }
+ return trimmed;
+ }
private void setupEventHandlers() {
// 鍓茶崏鏈虹紪鍙风紪杈戞寜閽簨浠�
if (mowerIdEditBtn != null) {
mowerIdEditBtn.addActionListener(e -> editMowerId());
}
+
+ // 鍓茶崏鏈洪暱瀹界紪杈戞寜閽簨浠�
+ if (mowerSizeEditBtn != null) {
+ mowerSizeEditBtn.addActionListener(e -> editMowerSize());
+ }
+
+ // 鍓茶崏瀹夊叏璺濈缂栬緫鎸夐挳浜嬩欢
+ if (mowingSafetyDistanceEditBtn != null) {
+ mowingSafetyDistanceEditBtn.addActionListener(e -> editMowingSafetyDistance());
+ }
+
+ if (baseStationIdEditBtn != null) {
+ baseStationIdEditBtn.addActionListener(e -> editBaseStationId());
+ }
// 妫�鏌ユ洿鏂版寜閽簨浠�
if (checkUpdateBtn != null) {
@@ -383,6 +1081,10 @@
if (feedbackButton != null) {
feedbackButton.addActionListener(e -> showFeedbackDialog());
}
+
+ if (idleTrailEditBtn != null) {
+ idleTrailEditBtn.addActionListener(e -> editIdleTrailDuration());
+ }
}
@@ -411,6 +1113,181 @@
}
}
+ private void editMowerSize() {
+ Device device = Device.getActiveDevice();
+ if (device == null) {
+ JOptionPane.showMessageDialog(this, "璁惧鏈垵濮嬪寲", "閿欒", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ // 鑾峰彇褰撳墠鍊煎苟杞崲涓虹背锛堝吋瀹规棫鏁版嵁锛�
+ double currentLengthMeters = convertToMeters(device.getMowerLength());
+ double currentWidthMeters = convertToMeters(device.getMowerWidth());
+
+ String currentLengthStr = currentLengthMeters >= 0 ? String.format("%.2f", currentLengthMeters) : "";
+ String currentWidthStr = currentWidthMeters >= 0 ? String.format("%.2f", currentWidthMeters) : "";
+
+ // 鍒涘缓杈撳叆瀵硅瘽妗�
+ JPanel inputPanel = new JPanel(new GridLayout(2, 2, 5, 5));
+ inputPanel.add(new JLabel("闀垮害(m):"));
+ JTextField lengthField = new JTextField(currentLengthStr);
+ inputPanel.add(lengthField);
+ inputPanel.add(new JLabel("瀹藉害(m):"));
+ JTextField widthField = new JTextField(currentWidthStr);
+ inputPanel.add(widthField);
+
+ int result = JOptionPane.showConfirmDialog(this,
+ inputPanel,
+ "淇敼鍓茶崏鏈洪暱瀹�",
+ JOptionPane.OK_CANCEL_OPTION,
+ JOptionPane.QUESTION_MESSAGE);
+
+ if (result == JOptionPane.OK_OPTION) {
+ String newLength = lengthField.getText().trim();
+ String newWidth = widthField.getText().trim();
+
+ // 楠岃瘉杈撳叆
+ if (newLength.isEmpty() && newWidth.isEmpty()) {
+ JOptionPane.showMessageDialog(this, "闀垮害鍜屽搴︿笉鑳藉悓鏃朵负绌�", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+
+ double lengthValue = -1;
+ double widthValue = -1;
+
+ if (!newLength.isEmpty()) {
+ try {
+ lengthValue = Double.parseDouble(newLength);
+ if (lengthValue < 0) {
+ JOptionPane.showMessageDialog(this, "闀垮害蹇呴』澶т簬绛変簬0", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+ } catch (NumberFormatException e) {
+ JOptionPane.showMessageDialog(this, "闀垮害蹇呴』鏄湁鏁堢殑鏁板瓧", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+ }
+
+ if (!newWidth.isEmpty()) {
+ try {
+ widthValue = Double.parseDouble(newWidth);
+ if (widthValue < 0) {
+ JOptionPane.showMessageDialog(this, "瀹藉害蹇呴』澶т簬绛変簬0", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+ } catch (NumberFormatException e) {
+ JOptionPane.showMessageDialog(this, "瀹藉害蹇呴』鏄湁鏁堢殑鏁板瓧", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+ }
+
+ // 鏇存柊璁惧灞炴�э紙淇濆瓨涓虹背锛屼繚鐣�2浣嶅皬鏁帮級
+ if (lengthValue >= 0) {
+ String lengthStr = String.format("%.2f", lengthValue);
+ device.setMowerLength(lengthStr);
+ device.updateField("mowerLength", lengthStr);
+ } else {
+ device.setMowerLength("-1");
+ device.updateField("mowerLength", "-1");
+ }
+
+ if (widthValue >= 0) {
+ String widthStr = String.format("%.2f", widthValue);
+ device.setMowerWidth(widthStr);
+ device.updateField("mowerWidth", widthStr);
+ } else {
+ device.setMowerWidth("-1");
+ device.updateField("mowerWidth", "-1");
+ }
+
+ // 濡傛灉闀垮害鍜屽搴﹂兘鏈夋晥锛岃嚜鍔ㄨ绠楀畨鍏ㄨ窛绂�
+ if (lengthValue > 0 && widthValue > 0) {
+ try {
+ double safetyDistance = MowerSafetyDistanceCalculator.calculateSafetyDistance(lengthValue, widthValue);
+ String safetyDistanceStr = String.format("%.2f", safetyDistance);
+ device.setMowingSafetyDistance(safetyDistanceStr);
+ device.updateField("mowingSafetyDistance", safetyDistanceStr);
+
+ // 鏇存柊瀹夊叏璺濈鏄剧ず
+ if (mowingSafetyDistanceLabel != null) {
+ mowingSafetyDistanceLabel.setText(formatMowingSafetyDistance());
+ }
+ } catch (IllegalArgumentException e) {
+ // 濡傛灉璁$畻澶辫触锛屼笉鏇存柊瀹夊叏璺濈
+ System.err.println("璁$畻瀹夊叏璺濈澶辫触: " + e.getMessage());
+ }
+ }
+
+ // 淇濆瓨鍒癲evice.properties
+ device.saveToProperties();
+
+ // 鏇存柊鏄剧ず
+ if (mowerSizeLabel != null) {
+ mowerSizeLabel.setText(formatMowerSize());
+ }
+ JOptionPane.showMessageDialog(this, "鍓茶崏鏈洪暱瀹芥洿鏂版垚鍔�" +
+ (lengthValue > 0 && widthValue > 0 ? "锛屽畨鍏ㄨ窛绂诲凡鑷姩璁$畻" : ""),
+ "鎴愬姛", JOptionPane.INFORMATION_MESSAGE);
+ }
+ }
+
+ private void editMowingSafetyDistance() {
+ Device device = Device.getActiveDevice();
+ if (device == null) {
+ JOptionPane.showMessageDialog(this, "璁惧鏈垵濮嬪寲", "閿欒", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ // 鑾峰彇褰撳墠鍊煎苟杞崲涓虹背锛堝吋瀹规棫鏁版嵁锛�
+ double currentDistanceMeters = convertToMeters(device.getMowingSafetyDistance());
+ String currentValueStr = currentDistanceMeters >= 0 ? String.format("%.2f", currentDistanceMeters) : "";
+
+ String newValue = (String) JOptionPane.showInputDialog(this,
+ "璇疯緭鍏ュ壊鑽夊畨鍏ㄨ窛绂�(鍗曚綅:m):",
+ "淇敼鍓茶崏瀹夊叏璺濈",
+ JOptionPane.QUESTION_MESSAGE,
+ null,
+ null,
+ currentValueStr);
+
+ if (newValue == null) {
+ return; // 鐢ㄦ埛鍙栨秷
+ }
+
+ newValue = newValue.trim();
+ if (newValue.isEmpty()) {
+ JOptionPane.showMessageDialog(this, "鍓茶崏瀹夊叏璺濈涓嶈兘涓虹┖", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+
+ // 楠岃瘉杈撳叆
+ double distanceValue;
+ try {
+ distanceValue = Double.parseDouble(newValue);
+ if (distanceValue < 0) {
+ JOptionPane.showMessageDialog(this, "鍓茶崏瀹夊叏璺濈蹇呴』澶т簬绛変簬0", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+ } catch (NumberFormatException e) {
+ JOptionPane.showMessageDialog(this, "鍓茶崏瀹夊叏璺濈蹇呴』鏄湁鏁堢殑鏁板瓧", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+
+ // 鏇存柊璁惧灞炴�э紙淇濆瓨涓虹背锛屼繚鐣�2浣嶅皬鏁帮級
+ String distanceStr = String.format("%.2f", distanceValue);
+ device.setMowingSafetyDistance(distanceStr);
+ device.updateField("mowingSafetyDistance", distanceStr);
+
+ // 淇濆瓨鍒癲evice.properties
+ device.saveToProperties();
+
+ // 鏇存柊鏄剧ず
+ if (mowingSafetyDistanceLabel != null) {
+ mowingSafetyDistanceLabel.setText(formatMowingSafetyDistance());
+ }
+ JOptionPane.showMessageDialog(this, "鍓茶崏瀹夊叏璺濈鏇存柊鎴愬姛", "鎴愬姛", JOptionPane.INFORMATION_MESSAGE);
+ }
+
private void editHandheldMarkerId() {
String currentValue = setData.getHandheldMarkerId() != null ? setData.getHandheldMarkerId() : "";
String newValue = (String) JOptionPane.showInputDialog(this,
@@ -438,6 +1315,97 @@
}
}
+ private void editBaseStationId() {
+ String currentValue = "鏈缃�".equals(resolveBaseStationId()) ? "" : resolveBaseStationId();
+ String newValue = (String) JOptionPane.showInputDialog(this,
+ "璇疯緭鍏ュ樊鍒嗗熀鍑嗙珯缂栧彿:",
+ "淇敼宸垎鍩哄噯绔欑紪鍙�",
+ JOptionPane.QUESTION_MESSAGE,
+ null,
+ null,
+ currentValue);
+
+ if (newValue == null) {
+ return;
+ }
+
+ newValue = newValue.trim();
+ if (newValue.isEmpty()) {
+ JOptionPane.showMessageDialog(this, "宸垎鍩哄噯绔欑紪鍙蜂笉鑳戒负绌�", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+
+ try {
+ baseStation.updateByDeviceId(newValue,
+ baseStation.getInstallationCoordinates(),
+ baseStation.getIotSimCardNumber(),
+ baseStation.getDeviceActivationTime(),
+ baseStation.getDataUpdateTime());
+ baseStation.load();
+ if (baseStationIdLabel != null) {
+ baseStationIdLabel.setText(resolveBaseStationId());
+ }
+ JOptionPane.showMessageDialog(this, "宸垎鍩哄噯绔欑紪鍙锋洿鏂版垚鍔�", "鎴愬姛", JOptionPane.INFORMATION_MESSAGE);
+ } catch (IllegalArgumentException ex) {
+ JOptionPane.showMessageDialog(this, ex.getMessage(), "杈撳叆閿欒", JOptionPane.WARNING_MESSAGE);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ JOptionPane.showMessageDialog(this, "宸垎鍩哄噯绔欑紪鍙锋洿鏂板け璐�", "閿欒", JOptionPane.ERROR_MESSAGE);
+ }
+ }
+
+ private void editIdleTrailDuration() {
+ int currentSeconds = setData != null ? setData.getIdleTrailDurationSeconds() : Setsys.DEFAULT_IDLE_TRAIL_DURATION_SECONDS;
+ if (currentSeconds <= 0) {
+ currentSeconds = Setsys.DEFAULT_IDLE_TRAIL_DURATION_SECONDS;
+ }
+
+ String input = JOptionPane.showInputDialog(this,
+ "璇疯緭鍏ヨ建杩规嫋灏炬椂闀匡紙鍗曚綅锛氱锛�",
+ currentSeconds);
+
+ if (input == null) {
+ return;
+ }
+
+ String trimmed = input.trim();
+ if (trimmed.isEmpty()) {
+ JOptionPane.showMessageDialog(this, "杞ㄨ抗鎷栧熬鏃堕暱涓嶈兘涓虹┖", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+
+ int parsedSeconds;
+ try {
+ parsedSeconds = Integer.parseInt(trimmed);
+ } catch (NumberFormatException ex) {
+ JOptionPane.showMessageDialog(this, "璇疯緭鍏ユ湁鏁堢殑鏁存暟绉掓暟", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+
+ if (parsedSeconds < 5 || parsedSeconds > 600) {
+ JOptionPane.showMessageDialog(this, "璇疯緭鍏�5鍒�600涔嬮棿鐨勭鏁�", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+
+ if (setData.updateProperty("idleTrailDurationSeconds", String.valueOf(parsedSeconds))) {
+ int appliedSeconds = setData.getIdleTrailDurationSeconds();
+ if (idleTrailDurationLabel != null) {
+ idleTrailDurationLabel.setText(appliedSeconds + "绉�");
+ }
+ MapRenderer renderer = null;
+ Shouye shouye = Shouye.getInstance();
+ if (shouye != null) {
+ renderer = shouye.getMapRenderer();
+ }
+ if (renderer != null) {
+ renderer.setIdleTrailDurationSeconds(appliedSeconds);
+ }
+ JOptionPane.showMessageDialog(this, "杞ㄨ抗鎷栧熬鏃堕暱宸叉洿鏂颁负 " + appliedSeconds + " 绉�", "鎴愬姛", JOptionPane.INFORMATION_MESSAGE);
+ } else {
+ JOptionPane.showMessageDialog(this, "杞ㄨ抗鎷栧熬鏃堕暱鏇存柊澶辫触", "閿欒", JOptionPane.ERROR_MESSAGE);
+ }
+ }
+
private void showFeedbackDialog() {
JDialog dialog = new JDialog(this, "闂鍙嶉鍜ㄨ", true);
dialog.setLayout(new BorderLayout(0, 12));
@@ -472,9 +1440,8 @@
photoControls.setAlignmentX(Component.LEFT_ALIGNMENT);
JLabel photoLabel = new JLabel("閫夋嫨鐓х墖锛堟渶澶�6寮狅級锛�");
photoLabel.setFont(new Font("寰蒋闆呴粦", Font.BOLD, 13));
- JButton selectPhotosButton = new JButton("閫夋嫨鐓х墖");
- selectPhotosButton.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 12));
- selectPhotosButton.setFocusPainted(false);
+ JButton selectPhotosButton = buttonset.createStyledButton("閫夋嫨鐓х墖", THEME_COLOR);
+ selectPhotosButton.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 12));
photoControls.add(photoLabel);
photoControls.add(selectPhotosButton);
content.add(photoControls);
@@ -494,13 +1461,11 @@
content.add(Box.createRigidArea(new Dimension(0, 20)));
- JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
- JButton cancelButton = new JButton("鏀惧純");
- JButton submitButton = new JButton("鎻愪氦");
- submitButton.setBackground(THEME_COLOR);
- submitButton.setForeground(Color.WHITE);
- submitButton.setFocusPainted(false);
- cancelButton.setFocusPainted(false);
+ JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+ JButton cancelButton = buttonset.createStyledButton("鏀惧純", new Color(128, 128, 128));
+ cancelButton.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 12));
+ JButton submitButton = buttonset.createStyledButton("鎻愪氦", THEME_COLOR);
+ submitButton.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 12));
buttonPanel.add(cancelButton);
buttonPanel.add(submitButton);
@@ -588,6 +1553,187 @@
}
}
+ /**
+ * 鏄剧ず鎵嬪姩缁樺埗杈圭晫鍧愭爣瀵硅瘽妗�
+ */
+ private void showManualBoundaryCoordinatesDialog() {
+ // 浠� shoudongbianjie.properties 鏂囦欢璇诲彇鍧愭爣
+ String coordinates = null;
+ int pointCount = 0;
+
+ try {
+ java.util.Properties props = new java.util.Properties();
+ java.io.File file = new java.io.File("shoudongbianjie.properties");
+
+ if (file.exists()) {
+ try (java.io.FileInputStream input = new java.io.FileInputStream(file)) {
+ props.load(input);
+ coordinates = props.getProperty("boundaryCoordinates");
+ String pointCountStr = props.getProperty("pointCount");
+ if (pointCountStr != null && !pointCountStr.trim().isEmpty()) {
+ try {
+ pointCount = Integer.parseInt(pointCountStr.trim());
+ } catch (NumberFormatException e) {
+ // 濡傛灉鏃犳硶瑙f瀽锛屼粠鍧愭爣瀛楃涓茶绠楃偣鏁�
+ if (coordinates != null && !coordinates.trim().isEmpty()) {
+ pointCount = coordinates.split(";").length;
+ }
+ }
+ } else if (coordinates != null && !coordinates.trim().isEmpty()) {
+ // 濡傛灉娌℃湁鐐规暟閲忥紝浠庡潗鏍囧瓧绗︿覆璁$畻
+ pointCount = coordinates.split(";").length;
+ }
+ }
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ JOptionPane.showMessageDialog(this,
+ "璇诲彇鍧愭爣鏂囦欢澶辫触: " + ex.getMessage(),
+ "閿欒",
+ JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ // 濡傛灉娌℃湁鍧愭爣鏁版嵁锛屾樉绀烘彁绀�
+ if (coordinates == null || coordinates.trim().isEmpty()) {
+ JOptionPane.showMessageDialog(this,
+ "褰撳墠娌℃湁淇濆瓨鐨勮竟鐣屽潗鏍�",
+ "鎻愮ず",
+ JOptionPane.INFORMATION_MESSAGE);
+ return;
+ }
+
+ // 鍒涘缓瀵硅瘽妗� - 瀹藉害鍜岀郴缁熻缃〉闈竴鏍凤紙400锛�
+ JDialog dialog = new JDialog(this, "鎵嬪姩缁樺埗杈圭晫鍧愭爣", true);
+ dialog.setLayout(new BorderLayout(0, 12));
+ dialog.setResizable(true);
+ dialog.setPreferredSize(new Dimension(400, 400));
+ dialog.setSize(new Dimension(400, 400));
+ dialog.setMinimumSize(new Dimension(400, 300));
+
+ JPanel content = new JPanel();
+ content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
+ content.setBorder(BorderFactory.createEmptyBorder(20, 24, 20, 24));
+ dialog.add(content, BorderLayout.CENTER);
+
+ // 鏍囬
+ String titleText = pointCount > 0
+ ? "鍧愭爣鐐瑰垪琛紙鍏� " + pointCount + " 涓偣锛夛細"
+ : "鍧愭爣鐐瑰垪琛細";
+ JLabel titleLabel = new JLabel(titleText);
+ titleLabel.setFont(new Font("寰蒋闆呴粦", Font.BOLD, 14));
+ titleLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
+ content.add(titleLabel);
+
+ content.add(Box.createRigidArea(new Dimension(0, 10)));
+
+ // 鍧愭爣鏂囨湰鍖哄煙
+ JTextArea coordinatesArea = new JTextArea(coordinates);
+ coordinatesArea.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 12));
+ coordinatesArea.setLineWrap(true);
+ coordinatesArea.setWrapStyleWord(false);
+ coordinatesArea.setEditable(false);
+ coordinatesArea.setBackground(Color.WHITE);
+ JScrollPane scrollPane = new JScrollPane(coordinatesArea);
+ scrollPane.setAlignmentX(Component.LEFT_ALIGNMENT);
+ scrollPane.setPreferredSize(new Dimension(0, 200));
+ content.add(scrollPane);
+
+ content.add(Box.createRigidArea(new Dimension(0, 16)));
+
+ // 鎸夐挳闈㈡澘
+ JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 0));
+ buttonPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+
+ // 鍒涘缓澶嶅埗鎸夐挳锛屼娇鐢ㄥ浘鏍�
+ JButton copyButton = new JButton();
+ try {
+ ImageIcon copyIcon = new ImageIcon("image/fuzhi.png");
+ if (copyIcon.getIconWidth() > 0) {
+ // 璋冩暣鍥炬爣澶у皬
+ Image scaledImage = copyIcon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH);
+ copyButton.setIcon(new ImageIcon(scaledImage));
+ } else {
+ copyButton.setText("澶嶅埗鍧愭爣");
+ }
+ } catch (Exception ex) {
+ copyButton.setText("澶嶅埗鍧愭爣");
+ System.err.println("鏃犳硶鍔犺浇澶嶅埗鍥炬爣: " + ex.getMessage());
+ }
+ copyButton.setContentAreaFilled(false);
+ copyButton.setBorder(null);
+ copyButton.setFocusPainted(false);
+ copyButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
+ copyButton.setToolTipText("澶嶅埗鍧愭爣");
+
+ // 鍔犺浇鎴愬姛鍥炬爣
+ ImageIcon successIcon = null;
+ try {
+ ImageIcon originalSuccessIcon = new ImageIcon("image/fuzhisucc.png");
+ if (originalSuccessIcon.getIconWidth() > 0) {
+ Image scaledSuccessImage = originalSuccessIcon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH);
+ successIcon = new ImageIcon(scaledSuccessImage);
+ }
+ } catch (Exception ex) {
+ System.err.println("鏃犳硶鍔犺浇鎴愬姛鍥炬爣: " + ex.getMessage());
+ }
+
+ final ImageIcon finalSuccessIcon = successIcon;
+ final ImageIcon originalCopyIcon = (ImageIcon) copyButton.getIcon();
+
+ copyButton.addActionListener(e -> {
+ String text = coordinatesArea.getText();
+ if (text != null && !text.trim().isEmpty()) {
+ java.awt.Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
+ new java.awt.datatransfer.StringSelection(text), null);
+
+ // 鍒囨崲涓烘垚鍔熷浘鏍�
+ if (finalSuccessIcon != null) {
+ copyButton.setIcon(finalSuccessIcon);
+ }
+
+ // 2绉掑悗鎭㈠涓哄師濮嬪浘鏍�
+ Timer restoreTimer = new Timer(2000, evt -> {
+ if (originalCopyIcon != null) {
+ copyButton.setIcon(originalCopyIcon);
+ }
+ });
+ restoreTimer.setRepeats(false);
+ restoreTimer.start();
+ }
+ });
+
+ // 鍒涘缓鍏抽棴鎸夐挳锛屼娇鐢ㄥ浘鏍�
+ JButton closeButton = new JButton();
+ try {
+ ImageIcon closeIcon = new ImageIcon("image/closepage.png");
+ if (closeIcon.getIconWidth() > 0) {
+ // 璋冩暣鍥炬爣澶у皬
+ Image scaledImage = closeIcon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH);
+ closeButton.setIcon(new ImageIcon(scaledImage));
+ } else {
+ closeButton.setText("鍏抽棴");
+ }
+ } catch (Exception ex) {
+ closeButton.setText("鍏抽棴");
+ System.err.println("鏃犳硶鍔犺浇鍏抽棴鍥炬爣: " + ex.getMessage());
+ }
+ closeButton.setContentAreaFilled(false);
+ closeButton.setBorder(null);
+ closeButton.setFocusPainted(false);
+ closeButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
+ closeButton.setToolTipText("鍏抽棴");
+ closeButton.addActionListener(e -> dialog.dispose());
+
+ buttonPanel.add(copyButton);
+ buttonPanel.add(closeButton);
+ content.add(buttonPanel);
+
+ dialog.pack();
+ dialog.setLocationRelativeTo(this);
+ dialog.setVisible(true);
+ }
+
private void checkForUpdates() {
// 妯℃嫙妫�鏌ユ洿鏂拌繃绋�
checkUpdateBtn.setEnabled(false);
--
Gitblit v1.10.0