From 5d6d890cfd10466d5d14ff5177adcc888baaa0e4 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期三, 17 十二月 2025 17:46:13 +0800
Subject: [PATCH] 新增了边界距离显示优化了设置页面布局
---
src/set/Sets.java | 232 ++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 200 insertions(+), 32 deletions(-)
diff --git a/src/set/Sets.java b/src/set/Sets.java
index 1529e53..b81eac5 100644
--- a/src/set/Sets.java
+++ b/src/set/Sets.java
@@ -12,6 +12,7 @@
import java.awt.*;
import java.awt.event.*;
+import java.awt.geom.RoundRectangle2D;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@@ -21,14 +22,15 @@
*/
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;
@@ -39,6 +41,7 @@
private JLabel firmwareVersionLabel;
private JLabel appVersionLabel;
private JLabel idleTrailDurationLabel;
+ private JLabel boundaryLengthVisibleLabel;
private JButton mowerIdEditBtn;
private JButton baseStationIdEditBtn;
@@ -78,30 +81,42 @@
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("鍓茶崏鏈虹紪鍙�",
@@ -137,23 +152,45 @@
formatIdleTrailDurationValue(), true);
idleTrailDurationLabel = (JLabel) idleTrailPanel.getClientProperty("valueLabel");
idleTrailEditBtn = (JButton) idleTrailPanel.getClientProperty("editButton");
+
+ // 鏄剧ず杈圭晫璺濈璁剧疆椤�
+ JPanel boundaryLengthPanel = createBoundaryLengthPanel();
+ boundaryLengthVisibleLabel = (JLabel) boundaryLengthPanel.getClientProperty("valueLabel");
JPanel feedbackPanel = createFeedbackPanel();
// APP鐗堟湰
JPanel appVersionPanel = createAppVersionPanel();
- addRowWithSpacing(panel, mowerIdPanel);
- addRowWithSpacing(panel, baseStationIdPanel);
- addRowWithSpacing(panel, handheldPanel);
- addRowWithSpacing(panel, simCardPanel);
- addRowWithSpacing(panel, baseStationSimPanel);
- addRowWithSpacing(panel, firmwarePanel);
- addRowWithSpacing(panel, idleTrailPanel);
- addRowWithSpacing(panel, feedbackPanel);
- addRowWithSpacing(panel, appVersionPanel);
+ // 娣诲姞璁剧疆椤癸紝浣跨敤鍒嗗壊绾垮垎闅�
+ addSettingItem(panel, mowerIdPanel, 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, 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 String formatIdleTrailDurationValue() {
@@ -164,18 +201,15 @@
return seconds + "绉�";
}
- private void addRowWithSpacing(JPanel container, JPanel row) {
- container.add(row);
- container.add(Box.createRigidArea(new Dimension(0, ROW_SPACING)));
- }
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();
@@ -221,11 +255,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();
@@ -265,11 +300,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();
@@ -297,6 +333,125 @@
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 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);
+ }
+ }
+ }
+
private JButton createEditButton() {
JButton button = new JButton();
try {
@@ -412,6 +567,19 @@
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);
+ }
+ }
+
// 鏇存柊APP鐗堟湰鏄剧ず
if (appVersionLabel != null) {
appVersionLabel.setText(setData.getAppVersion() != null ?
--
Gitblit v1.10.0