826220679@qq.com
3 天以前 b518f895dec5264fd25e22a68300c40ceba6f43d
src/dikuai/Dikuaiguanli.java
@@ -11,8 +11,6 @@
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import ui.UIConfig;
import ui.UIUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@@ -30,6 +28,9 @@
import zhuye.MapRenderer;
import zhuye.Shouye;
import zhuye.Coordinate;
import zhuye.buttonset;
import zhuye.Fuzhibutton;
import zhuye.Lookbutton;
import gecaoji.Device;
/**
@@ -314,10 +315,14 @@
      contentPanel.add(mowingSafetyDistancePanel);
      contentPanel.add(Box.createRigidArea(new Dimension(0, 10)));
      // 返回点坐标(带修改按钮)
      contentPanel.add(createCardInfoItemWithButton("返回点坐标:",
         getDisplayValue(dikuai.getReturnPointCoordinates(), "未设置"),
         "修改", e -> editReturnPoint(dikuai)));
      // 往返点路径(带查看图标按钮)
      JPanel returnPathPanel = createCardInfoItemWithButton("往返点路径:",
         getDisplayValue(dikuai.getReturnPathCoordinates(), "未设置"),
         createViewButton(e -> editReturnPath(dikuai)));
      configureInteractiveLabel(getInfoItemTitleLabel(returnPathPanel),
         () -> editReturnPath(dikuai),
         "点击查看/编辑往返点路径");
      contentPanel.add(returnPathPanel);
   contentPanel.add(Box.createRigidArea(new Dimension(0, 10)));
      ObstacleSummary obstacleSummary = getObstacleSummaryFromCache(dikuai.getLandNumber());
@@ -776,9 +781,80 @@
      contentPanel.add(scrollPane, BorderLayout.CENTER);
      JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
      JButton okButton = new JButton("确定");
      JButton cancelButton = new JButton("取消");
      JButton copyButton = new JButton("复制");
      // 判断是否是往返点路径对话框
      boolean isReturnPathDialog = title != null && title.contains("往返点路径");
      JButton okButton;
      JButton cancelButton;
      JButton copyButton;
      if (isReturnPathDialog) {
         // 往返点路径对话框:使用 buttonset 风格的确定按钮,图标按钮
         okButton = buttonset.createStyledButton("去绘制", new Color(70, 130, 220));
         // 取消按钮使用 closepage.png 图标
         cancelButton = new JButton();
         ImageIcon closeIcon = loadIcon("image/closepage.png", 25, 25);
         if (closeIcon != null) {
            cancelButton.setIcon(closeIcon);
         } else {
            cancelButton.setText("关闭");
         }
         cancelButton.setFont(new Font("微软雅黑", Font.PLAIN, 11));
         cancelButton.setForeground(PRIMARY_COLOR);
         cancelButton.setBorder(BorderFactory.createEmptyBorder());
         cancelButton.setContentAreaFilled(false);
         cancelButton.setFocusPainted(false);
         cancelButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
         cancelButton.addMouseListener(new MouseAdapter() {
            public void mouseEntered(MouseEvent e) { cancelButton.setOpaque(true); cancelButton.setBackground(new Color(255, 240, 240)); }
            public void mouseExited(MouseEvent e) { cancelButton.setOpaque(false); }
         });
         // 使用 Fuzhibutton 创建复制按钮
         copyButton = Fuzhibutton.createCopyButton(
            (java.util.function.Supplier<String>) () -> {
               String text = textArea.getText();
               if (text == null) {
                  text = "";
               }
               String trimmed = text.trim();
               if (trimmed.isEmpty() || "-1".equals(trimmed)) {
                  return null; // 返回null会触发"未设置要复制的内容"提示
               }
               return text;
            },
            "复制" + title,
            new Color(230, 250, 240)
         );
      } else {
         // 其他对话框保持原有样式
         okButton = new JButton("确定");
         cancelButton = new JButton("取消");
         copyButton = new JButton("复制");
         // 其他对话框的复制按钮逻辑
         copyButton.addActionListener(e -> {
            String text = textArea.getText();
            if (text == null) {
               text = "";
            }
            String trimmed = text.trim();
            if (trimmed.isEmpty() || "-1".equals(trimmed)) {
               JOptionPane.showMessageDialog(dialog, title + " 未设置", "提示", JOptionPane.INFORMATION_MESSAGE);
               return;
            }
            try {
               StringSelection selection = new StringSelection(text);
               Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
               clipboard.setContents(selection, selection);
               JOptionPane.showMessageDialog(dialog, title + " 已复制到剪贴板", "提示", JOptionPane.INFORMATION_MESSAGE);
            } catch (Exception ex) {
               JOptionPane.showMessageDialog(dialog, "复制失败: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
            }
         });
      }
      final boolean[] confirmed = new boolean[] {false};
      final String[] resultHolder = new String[1];
@@ -791,26 +867,6 @@
      cancelButton.addActionListener(e -> dialog.dispose());
      copyButton.addActionListener(e -> {
         String text = textArea.getText();
         if (text == null) {
            text = "";
         }
         String trimmed = text.trim();
         if (trimmed.isEmpty() || "-1".equals(trimmed)) {
            JOptionPane.showMessageDialog(dialog, title + " 未设置", "提示", JOptionPane.INFORMATION_MESSAGE);
            return;
         }
         try {
            StringSelection selection = new StringSelection(text);
            Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
            clipboard.setContents(selection, selection);
            JOptionPane.showMessageDialog(dialog, title + " 已复制到剪贴板", "提示", JOptionPane.INFORMATION_MESSAGE);
         } catch (Exception ex) {
            JOptionPane.showMessageDialog(dialog, "复制失败: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
         }
      });
      buttonPanel.add(okButton);
      buttonPanel.add(cancelButton);
      buttonPanel.add(copyButton);
@@ -819,6 +875,18 @@
      dialog.setContentPane(contentPanel);
      dialog.getRootPane().setDefaultButton(okButton);
      dialog.pack();
      // 如果是往返点路径对话框,设置宽度为首页的90%,高度保持不变
      if (isReturnPathDialog) {
         Shouye shouye = Shouye.getInstance();
         if (shouye != null && shouye.getWidth() > 0) {
            int homeWidth = shouye.getWidth();
            int dialogWidth = (int)(homeWidth * 0.9);
            Dimension currentSize = dialog.getSize();
            dialog.setSize(dialogWidth, currentSize.height);
         }
      }
      dialog.setLocationRelativeTo(this);
      dialog.setVisible(true);
@@ -1620,27 +1688,8 @@
   }
   private JButton createViewButton(ActionListener listener) {
      JButton btn = new JButton();
      ImageIcon lookIcon = loadIcon("image/look.png", 25, 25);
      if (lookIcon != null) {
         btn.setIcon(lookIcon);
      } else {
         btn.setText("查看");
      }
      btn.setFont(new Font("微软雅黑", Font.PLAIN, 11));
      btn.setForeground(PRIMARY_COLOR);
      btn.setBorder(BorderFactory.createEmptyBorder());
      btn.setContentAreaFilled(false);
      btn.setFocusPainted(false);
      btn.setCursor(new Cursor(Cursor.HAND_CURSOR));
      btn.addMouseListener(new MouseAdapter() {
         public void mouseEntered(MouseEvent e) { btn.setOpaque(true); btn.setBackground(new Color(230, 250, 240)); }
         public void mouseExited(MouseEvent e) { btn.setOpaque(false); }
      });
      if (listener != null) {
         btn.addActionListener(listener);
      }
      return btn;
      // 使用 Lookbutton 类创建查看按钮
      return Lookbutton.createViewButton(listener, new Color(230, 250, 240));
   }
   private JButton createPrimaryFooterButton(String text) {
@@ -1861,13 +1910,21 @@
      });
   }
   private void editReturnPoint(Dikuai dikuai) {
      FanhuiDialog fd = new FanhuiDialog(SwingUtilities.getWindowAncestor(this), dikuai);
      fd.setVisible(true);
      // 如果对话框已更新数据,刷新显示
      if (fd.isUpdated()) {
         loadDikuaiData();
   private void editReturnPath(Dikuai dikuai) {
      if (dikuai == null) {
         return;
      }
      String edited = promptCoordinateEditing("查看 / 编辑往返点路径", dikuai.getReturnPathCoordinates());
      if (edited == null) {
         return;
      }
      String normalized = normalizeCoordinateInput(edited);
      if (!saveFieldAndRefresh(dikuai, "returnPathCoordinates", normalized)) {
         JOptionPane.showMessageDialog(this, "无法更新往返点路径", "错误", JOptionPane.ERROR_MESSAGE);
         return;
      }
      String message = "-1".equals(normalized) ? "往返点路径已清空" : "往返点路径已更新";
      JOptionPane.showMessageDialog(this, message, "成功", JOptionPane.INFORMATION_MESSAGE);
   }
   /**