BigMapLabel.java
上传用户:njlgjx
上传日期:2022-08-07
资源大小:9105k
文件大小:5k
源码类别:

图形图象

开发平台:

Java

  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5. package com.mwq.map.mwing;
  6. import com.mwq.map.dao.Dao;
  7. import com.mwq.map.tool.InstancePool;
  8. import com.mwq.map.tool.MapProcessor;
  9. import java.awt.Color;
  10. import java.awt.Graphics;
  11. import java.util.Vector;
  12. import javax.swing.Icon;
  13. import javax.swing.JLabel;
  14. /**
  15.  *
  16.  * @author Administrator
  17.  */
  18. public class BigMapLabel extends JLabel {
  19.     private static final Dao dao = Dao.getInstance();
  20.     private static final Vector<Integer> ids = new Vector();// 标记主键集
  21.     private static final Vector<Integer> xs = new Vector();// X轴坐标集
  22.     private static final Vector<Integer> ys = new Vector();// Y轴坐标集
  23.     private static final Vector<String> texts = new Vector();// 标记文本集
  24.     private static final Vector<Boolean> shows = new Vector();// 是否显示集
  25.     private static MapProcessor mapProcessor;// 地图处理器对象
  26.     private static int operateIndex = -1;// 操作标记点索引
  27.     private static int stressId = -1;// 着重标记点主键
  28.     @Override
  29.     protected void paintComponent(Graphics g) {
  30.         super.paintComponent(g);
  31.         g.setColor(Color.ORANGE);// 设置笔触颜色
  32.         for (int i = 0; i < texts.size(); i++) {
  33.             int x = xs.get(i);// 标记点的X轴坐标
  34.             int y = ys.get(i);// 标记点的Y轴坐标
  35.             if (ids.get(i) == stressId) {// 为着重标记点
  36.                 g.setColor(Color.RED);// 修改笔触颜色
  37.                 g.fillOval(x - 5, y - 5, 10, 10);// 绘制标记点
  38.                 if (shows.get(i)) {// 如果显示标记文本
  39.                     g.drawString(texts.get(i), x + 8, y + 5);// 绘制标记文本
  40.                 }
  41.                 g.setColor(Color.ORANGE);// 还原笔触颜色
  42.             } else {// 为普通标记点
  43.                 g.fillOval(x - 5, y - 5, 10, 10);// 绘制标记点
  44.                 if (shows.get(i)) {// 如果显示标记文本
  45.                     g.drawString(texts.get(i), x + 8, y + 5);// 绘制标记文本
  46.                 }
  47.             }
  48.         }
  49.     }
  50.     public static void addSign(int id, int x, int y, String sign, boolean show) {
  51.         ids.add(id);
  52.         xs.add(x);
  53.         ys.add(y);
  54.         texts.add(sign);
  55.         shows.add(show);
  56.     }
  57.     public static void updateSign(int x, int y, String sign, boolean show) {
  58.         xs.set(operateIndex, x);
  59.         ys.set(operateIndex, y);
  60.         texts.set(operateIndex, sign);
  61.         shows.set(operateIndex, show);
  62.     }
  63.     public void removeSign() {
  64.         ids.remove(operateIndex);
  65.         xs.remove(operateIndex);
  66.         ys.remove(operateIndex);
  67.         texts.remove(operateIndex);
  68.         shows.remove(operateIndex);
  69.     }
  70.     public void setStress(int id) {
  71.         stressId = id;// 设置着重标记点主键
  72.     }
  73. public boolean isEnteredSign(int x, int y) {
  74.     int xDistance, yDistance;// 距标记点的距离
  75.     for (int i = 0; i < texts.size(); i++) {
  76.         xDistance = Math.abs(x - xs.get(i));// 计算水平距离
  77.         yDistance = Math.abs(y - ys.get(i));// 计算垂直距离
  78.         if (xDistance < 5 && yDistance < 5) {// 光标在该标记点之上
  79.             operateIndex = i;// 保存该标记点的索引
  80.             mapProcessor.rightClick(xs.get(i), ys.get(i));// 保存该标记点的坐标
  81.             return true;// 光标在该标记点之上
  82.         }
  83.     }
  84.     mapProcessor.rightClick(x, y);// 保存该标记点的坐标
  85.     return false;// 光标未在任何标记点之上
  86. }
  87.     @Override
  88.     public void setIcon(Icon icon) {
  89.         if (mapProcessor == null) {// 尚未获得地图处理器对象
  90.             if (InstancePool.getMapProcessor() != null) {// 如果地图处理器对象已经创建
  91.                 mapProcessor = InstancePool.getMapProcessor();// 获得地图处理器对象
  92.                 refreshSigns();// 刷新标记
  93.             }
  94.         } else {// 已经获得地图处理器对象
  95.             refreshSigns();// 刷新标记
  96.         }
  97.         super.setIcon(icon);
  98.     }
  99.     private void refreshSigns() {
  100.         ids.clear();
  101.         xs.clear();
  102.         ys.clear();
  103.         texts.clear();
  104.         shows.clear();
  105.         // 查询符合绘制条件的标记
  106.         Vector signs = dao.selectShowSigns(mapProcessor.getShowCenterX(), mapProcessor.getShowCenterY(),
  107.                 mapProcessor.getCutMapWidth(), mapProcessor.getCutMapHeight(), mapProcessor.getScale());
  108.         // 计算相对原点的坐标
  109.         int originX = mapProcessor.getShowCenterX() - mapProcessor.getCutMapWidth() / 2;
  110.         int originY = mapProcessor.getShowCenterY() - mapProcessor.getCutMapHeight() / 2;
  111.         float scale = mapProcessor.getScale();
  112.         for (int i = 0; i < signs.size(); i++) {// 遍历标记点集合
  113.             Vector sign = (Vector) signs.get(i);// 获得标记点
  114.             // 计算相对坐标
  115.             int x = (Integer) sign.get(2) - originX;
  116.             int y = (Integer) sign.get(3) - originY;
  117.             if (scale != 0) {// 进行了缩放
  118.                 if (scale > 0) {// 放大
  119.                     x = (int) (x * scale);
  120.                     y = (int) (y * scale);
  121.                 } else {// 缩小
  122.                     x = (int) (x / -scale);
  123.                     y = (int) (y / -scale);
  124.                 }
  125.             }
  126.             addSign((Integer) sign.get(0), x, y, sign.get(4).toString(), ((Integer) sign.get(5) == 1 ? true : false));
  127.         }
  128.     }
  129. }