package dell_Fence; // °üÃû£ºÎ§À¸¹ÜÀí import targets.Fence; // µ¼ÈëÄ¿±êÀࣺΧÀ¸ import targets.Mapdata; // µ¼ÈëÄ¿±êÀࣺµØÍ¼Êý¾Ý import javax.swing.*; // µ¼ÈëSwing×é¼þ import dell_map.Dell_Map; // µ¼ÈëµØÍ¼¹¤¾ßÀà import publicsWay.XyToLatLngConverter; import java.awt.*; // µ¼ÈëAWTͼÐÎ×é¼þ import java.sql.SQLException; // µ¼ÈëSQLÒì³£Àà import java.text.SimpleDateFormat; // µ¼ÈëÈÕÆÚ¸ñʽ»¯Àà import java.util.Date; // µ¼ÈëÈÕÆÚÀà import java.util.List; // µ¼ÈëÁбí½Ó¿Ú import java.util.ResourceBundle; // µ¼Èë¹ú¼Ê»¯×ÊÔ´°ü import java.util.Vector; // µ¼ÈëÏòÁ¿Àà import java.awt.geom.Point2D; // µ¼Èë¶þάµãÀà public class FenceDrawerFrame extends JPanel { // ΧÀ¸»æÖÆÖ÷½çÃæÀà private static final long serialVersionUID = 1L; // ÐòÁл¯°æ±¾ºÅ // UI×é¼þ private JComboBox mapComboBox; // µØÍ¼Ñ¡ÔñÏÂÀ­¿ò private JComboBox shapeComboBox; // ÐÎ×´Ñ¡ÔñÏÂÀ­¿ò private JButton startDrawButton; // ¿ªÊ¼»æÖư´Å¥ private JButton resetDrawButton; // ÖØÖûæÖư´Å¥ private JButton finishDrawButton; // Íê³É»æÖư´Å¥ private JPanel mapPanel; // µØÍ¼Ãæ°å private JLabel coordLabel; // ×ø±ê±êÇ© private ResourceBundle messages; // ¹ú¼Ê»¯×ÊÔ´°ü // µØÍ¼Êý¾Ý private Mapdata currentMap; // µ±Ç°µØÍ¼¶ÔÏó private MapCanvas mapCanvas; // µØÍ¼»­²¼ // »æÖÆ×´Ì¬ protected boolean isDrawing = false; // ÊÇ·ñÕýÔÚ»æÖÆ protected int currentShape = 0; // µ±Ç°»æÖÆÐÎ×´ protected Vector drawingPoints = new Vector<>(); // »æÖƵ㼯ºÏ public FenceDrawerFrame(ResourceBundle messages) { // ¹¹Ô캯Êý this.messages = messages; // ³õʼ»¯×ÊÔ´°ü setLayout(new BorderLayout()); // ÉèÖò¼¾ÖΪ±ß½ç²¼¾Ö initUI(); // ³õʼ»¯½çÃæ loadMaps(); // ¼ÓÔØµØÍ¼Áбí } private void initUI() { // ³õʼ»¯Óû§½çÃæ JPanel mainPanel = new JPanel(new BorderLayout()); // Ö÷Ãæ°å£¬±ß½ç²¼¾Ö // ¿ØÖÆÃæ°å JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 10)); // ¿ØÖÆÃæ°å£¬Á÷ʽ²¼¾Ö controlPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // ÉèÖñ߿ò¼ä¾à // ×´Ì¬Ãæ°å JPanel statusPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); // ×´Ì¬Ãæ°å£¬ÓÒ¶ÔÆëÁ÷ʽ²¼¾Ö coordLabel = new JLabel("X: 0.00, Y: 0.00"); // ÏÔÊ¾×ø±ê statusPanel.add(coordLabel); // Ìí¼Óµ½×´Ì¬Ãæ°å // µØÍ¼Ñ¡Ôñ JLabel mapLabel = new JLabel(getMessage("SELECT_MAP") + ":"); // µØÍ¼Ñ¡Ôñ±êÇ© mapComboBox = new JComboBox<>(); // µØÍ¼ÏÂÀ­¿ò mapComboBox.setPreferredSize(new Dimension(200, 30)); // ÉèÖôóС mapComboBox.addActionListener(e -> switchMap()); // Çл»µØÍ¼Ê¼þ // ÐÎ×´Ñ¡Ôñ JLabel shapeLabel = new JLabel(getMessage("FENCE_SHAPE") + ":"); // ÐÎ×´Ñ¡Ôñ±êÇ© shapeComboBox = new JComboBox<>(new String[]{ // ÐÎ×´ÏÂÀ­¿ò getMessage("POLYGON"), // ¶à±ßÐÎ getMessage("POLYLINE"), // ÐÂÔö¶à¶ÎÏßÑ¡Ïî getMessage("RECTANGLE"), // ¾ØÐÎ getMessage("CIRCLE") // Ô²ÐÎ }); shapeComboBox.setPreferredSize(new Dimension(100, 30)); // ÉèÖôóС shapeComboBox.addActionListener(e -> { // ÐÎ×´Çл»Ê¼þ currentShape = shapeComboBox.getSelectedIndex(); // ¸üе±Ç°ÐÎ×´ }); // »æÖư´Å¥ startDrawButton = new JButton(getMessage("START_DRAW")); // ¿ªÊ¼»æÖư´Å¥ startDrawButton.addActionListener(e -> startDrawing()); // ¿ªÊ¼»æÖÆÊ¼þ resetDrawButton = new JButton(getMessage("RESET_DRAW")); // ÖØÖûæÖư´Å¥ resetDrawButton.addActionListener(e -> resetDrawing()); // ÖØÖûæÖÆÊ¼þ resetDrawButton.setEnabled(false); // ³õʼ½ûÓà finishDrawButton = new JButton(getMessage("FINISH_DRAW")); // Íê³É»æÖư´Å¥ finishDrawButton.addActionListener(e -> finishDrawing()); // Íê³É»æÖÆÊ¼þ finishDrawButton.setEnabled(false); // ³õʼ½ûÓà // Ìí¼Ó×é¼þµ½¿ØÖÆÃæ°å controlPanel.add(mapLabel); // Ìí¼ÓµØÍ¼±êÇ© controlPanel.add(mapComboBox); // Ìí¼ÓµØÍ¼ÏÂÀ­¿ò controlPanel.add(shapeLabel); // Ìí¼ÓÐÎ×´±êÇ© controlPanel.add(shapeComboBox); // Ìí¼ÓÐÎ×´ÏÂÀ­¿ò controlPanel.add(startDrawButton); // Ìí¼Ó¿ªÊ¼°´Å¥ controlPanel.add(resetDrawButton); // Ìí¼ÓÖØÖð´Å¥ controlPanel.add(finishDrawButton); // Ìí¼ÓÍê³É°´Å¥ // µØÍ¼Ãæ°å mapPanel = new JPanel(new BorderLayout()); // µØÍ¼Ãæ°å£¬±ß½ç²¼¾Ö mapPanel.setBackground(Color.LIGHT_GRAY); // ÉèÖñ³¾°É« mainPanel.add(controlPanel, BorderLayout.NORTH); // ¿ØÖÆÃæ°å·Å¶¥²¿ mainPanel.add(mapPanel, BorderLayout.CENTER); // µØÍ¼Ãæ°å·ÅÖмä mainPanel.add(statusPanel, BorderLayout.SOUTH); // ×´Ì¬Ãæ°å·Åµ×²¿ add(mainPanel, BorderLayout.CENTER); // Ö÷Ãæ°åÌí¼Óµ½´°¿ÚÖмä } private void loadMaps() { // ¼ÓÔØµØÍ¼Áбí List maps = Dell_Map.getAllMaps(); // »ñÈ¡ËùÓеØÍ¼ mapComboBox.removeAllItems(); // Çå¿ÕÏÂÀ­¿ò for (Mapdata map : maps) { // ±éÀúµØÍ¼Áбí mapComboBox.addItem(map.getMapName()); // Ìí¼ÓµØÍ¼Ãû³Æµ½ÏÂÀ­¿ò } if (mapComboBox.getItemCount() > 0) { // Èç¹ûÓеØÍ¼ switchMap(); // Çл»µ½µÚÒ»¸öµØÍ¼ } } private void switchMap() { // Çл»µØÍ¼ String selectedMap = (String) mapComboBox.getSelectedItem(); // »ñȡѡÖеĵØÍ¼Ãû³Æ if (selectedMap == null) return; // Èç¹ûΪ¿ÕÔò·µ»Ø try { currentMap = Dell_Map.getMapByName(selectedMap); // ¸ù¾ÝÃû³Æ»ñÈ¡µØÍ¼¶ÔÏó if (currentMap == null) return; // Èç¹ûΪ¿ÕÔò·µ»Ø mapPanel.removeAll(); // Çå¿ÕµØÍ¼Ãæ°å mapCanvas = new MapCanvas(this, currentMap); // ´´½¨µØÍ¼»­²¼ mapPanel.add(mapCanvas, BorderLayout.CENTER); // Ìí¼Óµ½µØÍ¼Ãæ°åÖмä mapPanel.revalidate(); // ˢв¼¾Ö mapPanel.repaint(); // ÖØ»æ½çÃæ } catch (Exception ex) { // Òì³£´¦Àí JOptionPane.showMessageDialog(this, // µ¯³ö´íÎóÌáʾ getMessage("LOAD_MAP_ERROR") + ex.getMessage(), // ´íÎóÐÅÏ¢ getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); // ±êÌâºÍͼ±ê } } private void startDrawing() { // ¿ªÊ¼»æÖÆ isDrawing = true; // ÉèÖÃÕýÔÚ»æÖÆ×´Ì¬ resetDrawing(); // ÖØÖûæÖƵã startDrawButton.setEnabled(false); // ½ûÓÿªÊ¼°´Å¥ resetDrawButton.setEnabled(true); // ÆôÓÃÖØÖð´Å¥ finishDrawButton.setEnabled(true); // ÆôÓÃÍê³É°´Å¥ mapCanvas.setDrawingMode(true); // ÉèÖû­²¼Îª»æÖÆÄ£Ê½ } private void resetDrawing() { // ÖØÖûæÖÆ drawingPoints.clear(); // Çå¿Õ»æÖƵã mapCanvas.setDrawingPoints(drawingPoints); // ¸üл­²¼µã¼¯ mapCanvas.repaint(); // ÖØ»æ»­²¼ } // protected void finishDrawing() { // Íê³É»æÖÆ // if ((currentShape == 0 && drawingPoints.size() < 3) || // ¶à±ßÐÎÉÙÓÚ3µã // ((currentShape == 1 || currentShape == 2) && drawingPoints.size() < 2)) { // ¾ØÐλòÔ²ÐÎÉÙÓÚ2µã // JOptionPane.showMessageDialog(this, // µ¯³ö¾¯¸æ // currentShape == 0 ? getMessage("MIN_POINTS_WARNING") : getMessage("NEED_TWO_POINTS"), // ¸ù¾ÝÐÎ×´Ìáʾ // getMessage("WARNING"), JOptionPane.WARNING_MESSAGE); // ±êÌâºÍͼ±ê // return; // ·µ»Ø²»¼ÌÐø // } // // isDrawing = false; // ½áÊø»æÖÆ×´Ì¬ // startDrawButton.setEnabled(true); // ÆôÓÿªÊ¼°´Å¥ // mapCanvas.repaint(); // ÖØ»æ»­²¼ // showFenceInfoDialog(); // ÏÔʾΧÀ¸ÐÅÏ¢¶Ô»°¿ò // } // protected void finishDrawing() { // ¸ù¾ÝÐÎ×´ÀàÐͼì²é×îСµãÊýÒªÇó if ((currentShape == 0 && drawingPoints.size() < 3) || // ¶à±ßÐÎÖÁÉÙ3µã ((currentShape == 2 || currentShape == 3) && drawingPoints.size() < 2) || // ¾ØÐÎ/Ô²ÐÎÖÁÉÙ2µã (currentShape == 1 && drawingPoints.size() < 2)) { // ¶à¶ÎÏßÖÁÉÙ2µã String message = ""; if (currentShape == 0) { message = getMessage("MIN_POINTS_WARNING"); // ¶à±ßÐÎÌáʾ } else if (currentShape == 1) { message = getMessage("MIN_POINTS_POLYLINE"); // ¶à¶ÎÏßÌáʾ } else { message = getMessage("NEED_TWO_POINTS"); // ÆäËûÐÎ×´Ìáʾ } JOptionPane.showMessageDialog(this, message, getMessage("WARNING"), JOptionPane.WARNING_MESSAGE); return; } isDrawing = false; startDrawButton.setEnabled(true); // resetDrawButton.setEnabled(false); // finishDrawButton.setEnabled(false); // mapCanvas.setDrawingMode(false); mapCanvas.repaint(); showFenceInfoDialog(); } private void showFenceInfoDialog() { // ÏÔʾΧÀ¸ÐÅÏ¢¶Ô»°¿ò Frame parentFrame = (Frame) SwingUtilities.getWindowAncestor(this); // »ñÈ¡¸¸´°¿Ú FenceInfoDialog dialog = new FenceInfoDialog( // ´´½¨¶Ô»°¿ò parentFrame, // ¸¸´°¿Ú messages, // ¹ú¼Ê»¯×ÊÔ´ currentShape, // µ±Ç°ÐÎ×´ drawingPoints, // »æÖƵã this::saveFence // ±£´æ»Øµ÷ ); dialog.setLocationRelativeTo(this); // ¾ÓÖÐÏÔʾ dialog.setVisible(true); // ÏÔʾ¶Ô»°¿ò } private void saveFence(String name, String type, String department, String color, String company, String layer, String startTime, String endTime, String enabled) { Fence fence = new Fence(); // ÉèÖûù±¾ÊôÐÔ fence.setFenceName(name); fence.setFenceType(type); fence.setRelatedDepartment(department); fence.setColor(color); fence.setCompany(company); fence.setLayer(layer); fence.setEffectiveTime(startTime); fence.setExpirationTime(endTime); fence.setIsEnabled(enabled); // ÉèÖÃÐÎ×´ÀàÐÍ String shape = ""; switch (currentShape) { case 0: shape = getMessage("POLYGON"); break; case 1: shape = getMessage("POLYLINE"); break; case 2: shape = getMessage("RECTANGLE"); break; case 3: shape = getMessage("CIRCLE"); break; } fence.setShape(shape); // ÉèÖÃ×ø±ê·¶Î§ StringBuilder coordinates = new StringBuilder(); for (Point2D.Double p : drawingPoints) { if (coordinates.length() > 0) coordinates.append(";"); coordinates.append(String.format("%.2f,%.2f", p.x, p.y)); } fence.setValidRangeXy(coordinates.toString()); // ÉèÖþ­Î³¶È×ø±ê£¨×ª»»ºóµÄ£© String validRangeCoordinates = convertXYToLatLng(drawingPoints, currentMap); fence.setValidRangeCoordinates(validRangeCoordinates != null ? validRangeCoordinates : ""); // ÉèÖÃÌí¼Óʱ¼ä fence.setAddedTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // === ¹Ø¼üÐ޸ģºÎªÊý¾Ý¿â×Ö¶ÎÉèÖÃĬÈÏÖµ === // ÊýÖµÐÍ×Ö¶ÎĬÈÏÖµ fence.setBottomHeight("-1"); fence.setTopHeight("-1"); fence.setGatheringRadius("-1"); fence.setMaxPeople("-1"); fence.setMinPeople("-1"); fence.setMaxDuration("-1"); fence.setMinDuration("-1"); fence.setInspectionOrder("-1"); fence.setInspectionCount("-1"); fence.setSides("-1"); // ×Ö·û´®×Ö¶ÎĬÈÏÖµ fence.setGatheringTime("-1"); fence.setHazardousMaterial("-1"); fence.setLatestInspectionTime("-1"); fence.setCanEnter("-1"); fence.setCanExit("-1"); fence.setConstraintType("-1"); fence.setConstraintDescription("-1"); fence.setCameraNumber("-1"); // ±£Áô×Ö¶ÎĬÈÏÖµ fence.setReserved1("-1"); fence.setReserved2("-1"); fence.setReserved3("-1"); fence.setReserved4("-1"); fence.setReserved5("-1"); fence.setReserved6("-1"); fence.setReserved7("-1"); fence.setReserved8("-1"); fence.setReserved9("-1"); fence.setReserved10("-1"); // === ½áÊø¹Ø¼üÐÞ¸Ä === try { Dell_Fence.insertFence(fence); Dell_Fence.getAllFences().add(fence); JOptionPane.showMessageDialog(this, getMessage("FENCE") + name + getMessage("SAVE_SUCCESS"), getMessage("SUCCESS"), JOptionPane.INFORMATION_MESSAGE); } catch (SQLException ex) { JOptionPane.showMessageDialog(this, getMessage("SAVE_FENCE_ERROR") + ": " + ex.getMessage(), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); } } public String getMessage(String key) { // »ñÈ¡¹ú¼Ê»¯Îı¾ try { return messages.getString(key); // ´Ó×ÊÔ´°ü»ñÈ¡ } catch (Exception e) { return "[" + key + "]"; // Òì³£·µ»Ø¼üÃû } } public JLabel getCoordLabel() { // »ñÈ¡×ø±ê±êÇ© return coordLabel; // ·µ»Ø±êÇ©¶ÔÏó } @FunctionalInterface // º¯Êýʽ½Ó¿Ú public interface SaveFenceCallback { // ±£´æÎ§À¸»Øµ÷½Ó¿Ú void save(String name, String type, String department, String color, String company, String layer, String startTime, String endTime, String enabled); // ±£´æ·½·¨ } // ÐÂÔö×ø±êת»»·½·¨ private String convertXYToLatLng(Vector points, Mapdata map) { StringBuilder result = new StringBuilder(); // »ñÈ¡µØÍ¼µÄAµãºÍBµã×ø±êÐÅÏ¢ String ajw = map.getPointALatlngXyCoordinate(); String bjw = map.getPointBLatlngXyCoordinate(); if (ajw == null || bjw == null || ajw.isEmpty() || bjw.isEmpty()) { return ""; // Èç¹ûAµã»òBµã×ø±ê²»´æÔÚ£¬·µ»Ø¿Õ×Ö·û´® } String[] A = ajw.split(";"); String[] B = bjw.split(";"); if (A.length < 4 || B.length < 4) { return ""; // ×ø±ê¸ñʽ²»ÕýÈ·£¬·µ»Ø¿Õ×Ö·û´® } try { double lon_a = Double.parseDouble(A[0]); double lat_a = Double.parseDouble(A[1]); double xa = Double.parseDouble(A[2]); double ya = Double.parseDouble(A[3]); double lon_b = Double.parseDouble(B[0]); double lat_b = Double.parseDouble(B[1]); double xb = Double.parseDouble(B[2]); double yb = Double.parseDouble(B[3]); // ¶Ôÿ¸öµã½øÐÐ×ø±êת»» for (Point2D.Double point : points) { String[] latLng = XyToLatLngConverter.convertLocalToGlobalCoordinates( String.valueOf(point.x), String.valueOf(point.y), lat_a, lon_a, lat_b, lon_b, xa, ya, xb, yb ); if (result.length() > 0) { result.append(";"); } // ¸ñʽ: γ¶È,¾­¶È result.append(latLng[0]).append(",").append(latLng[1]); } } catch (Exception e) { e.printStackTrace(); return ""; } return result.toString(); } }