From 87d7cf316e983b0398b270de03a8092412af8487 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期五, 19 十二月 2025 16:56:30 +0800
Subject: [PATCH] 新增了收到绘制边界模式
---
src/set/Sets.java | 373 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 373 insertions(+), 0 deletions(-)
diff --git a/src/set/Sets.java b/src/set/Sets.java
index 5b2bafa..6f5ea93 100644
--- a/src/set/Sets.java
+++ b/src/set/Sets.java
@@ -13,9 +13,11 @@
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鏍峰紡
@@ -45,6 +47,7 @@
private JLabel idleTrailDurationLabel;
private JLabel boundaryLengthVisibleLabel;
private JLabel measurementModeEnabledLabel;
+ private JLabel manualBoundaryDrawingModeLabel;
private JButton mowerIdEditBtn;
private JButton mowerSizeEditBtn;
@@ -177,6 +180,10 @@
// 寮�鍚祴閲忔ā寮忚缃」
JPanel measurementModePanel = createMeasurementModePanel();
measurementModeEnabledLabel = (JLabel) measurementModePanel.getClientProperty("valueLabel");
+
+ // 鎵嬪姩缁樺埗杈圭晫妯″紡璁剧疆椤�
+ JPanel manualBoundaryDrawingPanel = createManualBoundaryDrawingPanel();
+ manualBoundaryDrawingModeLabel = (JLabel) manualBoundaryDrawingPanel.getClientProperty("valueLabel");
JPanel feedbackPanel = createFeedbackPanel();
@@ -195,6 +202,7 @@
addSettingItem(panel, idleTrailPanel, true);
addSettingItem(panel, boundaryLengthPanel, true);
addSettingItem(panel, measurementModePanel, true);
+ addSettingItem(panel, manualBoundaryDrawingPanel, true);
addSettingItem(panel, feedbackPanel, true);
addSettingItem(panel, appVersionPanel, false); // 鏈�鍚庝竴椤逛笉鍔犲垎鍓茬嚎
@@ -469,6 +477,157 @@
}
/**
+ * 鍒涘缓鎵嬪姩缁樺埗杈圭晫妯″紡璁剧疆闈㈡澘
+ */
+ 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() {
@@ -593,6 +752,16 @@
if (renderer != null) {
renderer.repaint();
}
+ // 閫氱煡棣栭〉鏇存柊鎮诞杩斿洖鎸夐挳鏄剧ず鐘舵��
+ shouye.updateSettingsReturnButtonVisibility();
+ }
+
+ // 濡傛灉寮�鍚紝鍏抽棴绯荤粺璁剧疆椤甸潰骞惰繑鍥為椤�
+ if (newValue) {
+ SwingUtilities.invokeLater(() -> {
+ setVisible(false);
+ dispose();
+ });
}
}
@@ -662,6 +831,16 @@
if (renderer != null) {
renderer.setBoundaryLengthVisible(newValue);
}
+ // 閫氱煡棣栭〉鏇存柊鎮诞杩斿洖鎸夐挳鏄剧ず鐘舵��
+ shouye.updateSettingsReturnButtonVisibility();
+ }
+
+ // 濡傛灉寮�鍚紝鍏抽棴绯荤粺璁剧疆椤甸潰骞惰繑鍥為椤�
+ if (newValue) {
+ SwingUtilities.invokeLater(() -> {
+ setVisible(false);
+ dispose();
+ });
}
}
@@ -821,6 +1000,19 @@
}
}
+ // 鏇存柊鎵嬪姩缁樺埗杈圭晫妯″紡鐘舵��
+ 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) {
appVersionLabel.setText(setData.getAppVersion() != null ?
@@ -1362,6 +1554,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