2010-06-02 62 views
1

我有一个很大的JPanel,它拥有许多TileMapping对象(TileMapping扩展JPanel)。我想缩放大型JPanel及其所有组件以缩放。 TileMapping具有当然也必须放大的图像。放大JPanel及其所有组件

这里是我的TileMapping类

public class TileMapping extends JPanel { 

    private double zoom = 1.0; 
    private Mapping mapping; 
    private int height; 
    private int width; 
    private int xCoord; 
    private int yCoord; 

    TileMapping(Mapping m, int w, int h, int x, int y) { 
     super(); 
     mapping = m; 
     height = h; 
     width = w; 
     this.xCoord = x; 
     this.yCoord = y; 
     this.setPreferredSize(new Dimension(w, h)); 
    } 

    public int getXcoord() { 
     return xCoord; 
    } 

    public int getYcoord() { 
     return yCoord; 
    } 

    public Mapping getMapping() { 
     return mapping; 
    } 

    public void setMapping(Mapping m) { 
     mapping = m; 
    } 

    public void originalSize() { 
     zoom = 1; 
    } 

    public void zoomIn() { 
     zoom += 0.2; 
    } 

    public void zoomOut() { 
     zoom -= 0.2; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     if (mapping.getImage() != null) { 
      BufferedImage bg = mapping.getImage(); 
      g2d.scale(zoom, zoom); 
      g2d.drawImage(bg, 0, 0, width, height, this); 
     } else { 
      g2d.scale(zoom, zoom); 
      this.setBackground(Color.white); 
     } 

    } 
} 

我得知道我应该继续这种在其上使用此代码填入主要的JPanel:这 是MapWindow类的一部分。如果你仔细阅读代码,你会明白我在说什么。基本上这是一个Tile MapEditor,我将一个Tile模拟为一个JPanel,它包含映射对象(映射是ASCII字符和图像之间的绑定)。

private void populateMapPanel(Map map) { 
     GridBagConstraints c = new GridBagConstraints(); 
     mapPanel.setLayout(new GridBagLayout()); 

     for (int i = 0; i < map.getMapGrid().getRows(); i++) { 
      for (int j = 0; j < map.getMapGrid().getColumns(); j++) { 
       tile = new TileMapping(map.getMapItem(i, j), cellSize, cellSize, i, j); 
       tile.setBorder(new LineBorder(Color.black)); 
       tile.addMouseListener(this); 
       tile.addMouseMotionListener(this); 
       c.gridx = i; 
       c.gridy = j; 
       mapPanel.add(tile, c); 
      } 
     } 
     mapPanel.validate(); 
     mapPanel.repaint(); 
    } 

我需要知道如何做到以下几点:1。 当用户按下放大的mapPanel应该放大以及所有的图像在较小的面板。 2.当用户点击并拖动TileMappings时,应该在它们上面绘制图像,并且当mapPanel放大时,该图像应该缩放。

伪代码,想法,提示,Java代码......任何东西都会有所帮助。 谢谢

回答