package zhuye; import ui.UIConfig; import javax.swing.*; import java.awt.*; public class LegendDialog extends JDialog { public LegendDialog(Component parent, Color ignoredThemeColor) { super(parent != null ? (JFrame) SwingUtilities.getWindowAncestor(parent) : null, "图例", true); // 使用统一宽度,高度缩减为一半 initializeDialog(UIConfig.DIALOG_WIDTH, UIConfig.DIALOG_HEIGHT / 2); initializeLegendContent(); if (parent == null) { setLocationRelativeTo(null); // 居中显示 } } private void initializeDialog(int width, int height) { setSize(width, height); setLocationRelativeTo(getParent()); setResizable(false); getContentPane().setBackground(Color.WHITE); } private void initializeLegendContent() { // 主面板使用BorderLayout JPanel mainPanel = new JPanel(new BorderLayout()); mainPanel.setBackground(Color.WHITE); mainPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 10, 15)); // 标题 - 修改为"图例" JLabel titleLabel = new JLabel("图例", JLabel.CENTER); titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 14)); titleLabel.setForeground(new Color(60, 60, 60)); titleLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); mainPanel.add(titleLabel, BorderLayout.NORTH); // 图例内容面板 - 直接添加,不使用滚动条 JPanel contentPanel = new JPanel(); contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS)); contentPanel.setBackground(Color.WHITE); contentPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(new Color(220, 220, 220), 1), BorderFactory.createEmptyBorder(10, 10, 10, 10) )); String[][] legendItems = { {"草坪区域", "144,238,144", "fill"}, {"区域顶点", "128,0,128", "point"}, {"割草机路径", "255,0,0", "line"}, {"路径方向", "255,0,0", "arrow"}, {"障碍物区域", "255,0,0", "obstacle_fill"}, {"割草机位置", "0,150,0", "mow"}, {"割草轨迹", "100,150,200", "trail"} }; for (String[] item : legendItems) { contentPanel.add(createLegendItem(item[0], item[1], item[2])); contentPanel.add(Box.createRigidArea(new Dimension(0, 6))); // 缩小行间距 } // 移除最后一个间距组件,避免底部多余空白 if (contentPanel.getComponentCount() > 0) { contentPanel.remove(contentPanel.getComponentCount() - 1); } // 直接添加内容面板,不使用滚动条 mainPanel.add(contentPanel, BorderLayout.CENTER); getContentPane().add(mainPanel); } private JPanel createLegendItem(String text, String color, String type) { JPanel itemPanel = new JPanel(new BorderLayout(8, 0)); // 减小组件间距 itemPanel.setBackground(Color.WHITE); itemPanel.setMaximumSize(new Dimension(160, 25)); // 减小高度 String[] rgb = color.split(","); Color itemColor = new Color( Integer.parseInt(rgb[0]), Integer.parseInt(rgb[1]), Integer.parseInt(rgb[2]) ); // 图标面板 JPanel iconPanel = new JPanel() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int size = 16; // 缩小图标尺寸 int x = (getWidth() - size) / 2; int y = (getHeight() - size) / 2; switch (type) { case "fill": g2d.setColor(itemColor); g2d.fillRect(x, y, size, size); g2d.setColor(new Color(100, 100, 100)); g2d.setStroke(new BasicStroke(1)); g2d.drawRect(x, y, size, size); break; case "point": g2d.setColor(itemColor); g2d.fillOval(x, y, size, size); g2d.setColor(new Color(100, 100, 100)); g2d.setStroke(new BasicStroke(1)); g2d.drawOval(x, y, size, size); break; case "line": g2d.setColor(itemColor); g2d.setStroke(new BasicStroke(2)); // 减小线宽 g2d.drawLine(x, y + size/2, x + size, y + size/2); break; case "arrow": g2d.setColor(itemColor); g2d.setStroke(new BasicStroke(1.5f)); // 减小线宽 g2d.drawLine(x, y + size/2, x + size, y + size/2); int[] xPoints = {x + size, x + size - 4, x + size - 4}; // 缩小箭头 int[] yPoints = {y + size/2, y + size/2 - 3, y + size/2 + 3}; g2d.fillPolygon(xPoints, yPoints, 3); break; case "mow": g2d.setColor(itemColor); g2d.fillOval(x, y, size, size); g2d.setColor(new Color(100, 100, 100)); g2d.setStroke(new BasicStroke(1)); g2d.drawOval(x, y, size, size); break; case "trail": g2d.setColor(itemColor); g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); // 减小线宽 g2d.drawLine(x, y + size/2, x + size, y + size/2); break; case "obstacle_fill": g2d.setColor(new Color(255, 0, 0, 77)); g2d.fillRect(x, y, size, size); g2d.setColor(Color.RED); g2d.setStroke(new BasicStroke(1.5f)); // 减小线宽 g2d.drawRect(x, y, size, size); break; } } }; iconPanel.setPreferredSize(new Dimension(35, 25)); // 缩小图标面板 iconPanel.setBackground(Color.WHITE); // 文本标签 JLabel textLabel = new JLabel(text); textLabel.setFont(new Font("微软雅黑", Font.PLAIN, 11)); // 缩小字体 textLabel.setForeground(new Color(80, 80, 80)); itemPanel.add(iconPanel, BorderLayout.WEST); itemPanel.add(textLabel, BorderLayout.CENTER); return itemPanel; } }