我想可以这样:
首先根据地图生成一个该地图的GIF或者JPEG文件,放入一个缓冲区
然后根据鼠标的坐标到缓冲区里找到对应的区域显示,放大镜相当于一个Label

解决方案 »

  1.   

    功能我已经实现,在mouseMoved()里如下:
    GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice screen = environment.getDefaultScreenDevice();
    Robot robot = null;
    p = e.getPoint();
    if (p == null){return;}
    Object temp = e.getSource();
    if (temp instanceof Component)
       SwingUtilities.convertPointToScreen(p,(Component)temp);
    else
       SwingUtilities.convertPointToScreen(p,test.this);
    Rectangle screenRect = new Rectangle(p.x-10,p.y-10,20,20);
    BufferedImage image = robot.createScreenCapture(screenRect);//抓图
    //以下是放大鼠标周围20pix的空间,factor = 2;
    AffineTransform transform = AffineTransform.getScaleInstance(factor,factor);
    BufferedImageOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
    BufferedImage filteredImage = new BufferedImage(image.getWidth()*factor, image.getHeight()*factor, image.getType());
    op.filter(image, filteredImage);
    ImageIcon icon = new ImageIcon(filteredImage);
    xxx.setSize(20*factor,20*factor);//在JLabel xxx上显示放大的效果
    xxx.setIcon(icon);但放大之后图片不清晰,有什么改进方法吗?
      

  2.   


    public class SuperView extends JPanel
    {
       SuperModel model;
       TreeView treeView;
       TopoView topoView;
       
       public SuperView(SuperModel model)
       {
          this.model=model;
          BorderLayout borderLayout=new BorderLayout();
          this.setLayout(borderLayout);      treeView=new TreeView(model);
          topoView=new TopoView(model);      JScrollPane treeScrollPane=new JScrollPane(treeView);
          JScrollPane topoScrollPane=new JScrollPane(topoView);      JSplitPane splitPane=new JSplitPane();
          splitPane.add(treeScrollPane,JSplitPane.LEFT);
          splitPane.add(topoScrollPane,JSplitPane.RIGHT);
          this.add(splitPane,BorderLayout.CENTER);
       }
       public void update()
       {
          topoView.topoViewPanel.repaint();
          treeView.reload();
       }
    }