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<String> mapComboBox; // µØÍ¼Ñ¡ÔñÏÂÀ¿ò
|
private JComboBox<String> 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<Point2D.Double> 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<Mapdata> 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<Point2D.Double> 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();
|
}
|
}
|