2012-02-12 70 views
1

对于那些真正看过我的帖子的人,我的代码已经很好地发展到现在我可以按我想要的方式显示我的精灵表。这里是我的代码:添加滚动条和图像调整大小问题

import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.ScrollPaneConstants; 

public class AnimTest 
{ 
public static void main(String[] args) 
{ 
    AnimTest test = new AnimTest(); 
    test.go(); 
} 

public void go() 
{ 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    MyDrawP drawP = new MyDrawP(); 
    frame.getContentPane().add(drawP); 
    frame.setSize(640,640); 
    frame.setVisible(true); 
    frame.setResizable(true); 

} 
} 

class MyDrawP extends JPanel 
{ 

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    try { 

     BufferedImage bigImg = ImageIO.read(new File("C:/Users/scott/Desktop/Personal Work/Pixel Art/terrain.png")); 

     final int width = 64; 
     final int height = 64; 
     final int rows = 5; 
     final int cols = 16; 
     final int mapX = 10; 
     final int mapY = 8; 

     BufferedImage[][] sprites = new BufferedImage[cols][rows]; 

     for (int i = 0; i < rows; i++) 
     { 
      for (int j = 0; j < cols; j++) 
      { 
       //System.out.println("J is: " + j); 
       //System.out.println("I is: " + i); 
       //System.out.println("i * width is: " + i * width); 
       //System.out.println("j * height is: " + j * height); 
       //System.out.println(""); 

       sprites[j][i] = bigImg.getSubimage(j * width, i * height, width, height); 
       //g.drawImage(sprites[j][i], 5, 5, this); 
      } 
     } 
      for (int i = 0; i < mapX; i++) 
      { 
       for (int j = 0; j < mapY; j++) 
       { 
       ArrayList<BufferedImage> spriteListRoad = new ArrayList<BufferedImage>(); 
       BufferedImage road4way = sprites[0][0]; 
       spriteListRoad.add(road4way); 
       BufferedImage roadS = sprites[1][0]; 
       spriteListRoad.add(roadS); 
       BufferedImage roadV = sprites[2][0]; 
       spriteListRoad.add(roadV); 
       BufferedImage roadH = sprites[3][0]; 
       spriteListRoad.add(roadH); 
       BufferedImage roadEndU = sprites[4][0]; 
       spriteListRoad.add(roadEndU); 
       BufferedImage roadEndL = sprites[5][0]; 
       spriteListRoad.add(roadEndL); 
       BufferedImage roadEndR = sprites[6][0]; 
       spriteListRoad.add(roadEndR); 
       BufferedImage roadEndD = sprites[7][0]; 
       spriteListRoad.add(roadEndD); 
       BufferedImage roadLU = sprites[8][0]; 
       spriteListRoad.add(roadLU); 
       BufferedImage roadRU = sprites[9][0]; 
       spriteListRoad.add(roadRU); 
       BufferedImage roadLD = sprites[10][0]; 
       spriteListRoad.add(roadLD); 
       BufferedImage roadRD = sprites[11][0]; 
       spriteListRoad.add(roadRD); 
       BufferedImage roadUT = sprites[12][0]; 
       spriteListRoad.add(roadUT); 
       BufferedImage roadLT = sprites[13][0]; 
       spriteListRoad.add(roadLT); 
       BufferedImage roadRT = sprites[14][0]; 
       spriteListRoad.add(roadRT); 
       BufferedImage roadDT = sprites[15][0]; 
       spriteListRoad.add(roadDT); 

       ArrayList<BufferedImage> spriteListRiver = new ArrayList<BufferedImage>(); 
       BufferedImage riverV = sprites[0][1]; 
       spriteListRiver.add(riverV); 
       BufferedImage riverH = sprites[1][1]; 
       spriteListRiver.add(riverH); 
       BufferedImage riverLU = sprites[2][1]; 
       spriteListRiver.add(riverLU); 
       BufferedImage riverRU = sprites[3][1]; 
       spriteListRiver.add(riverRU); 
       BufferedImage riverLD = sprites[4][1]; 
       spriteListRiver.add(riverLD); 
       BufferedImage riverRD = sprites[5][1]; 
       spriteListRiver.add(riverRD); 
       BufferedImage riverRoadV = sprites[6][1]; 
       spriteListRiver.add(riverRoadV); 
       BufferedImage riverRoadH = sprites[7][1]; 
       spriteListRiver.add(riverRoadH); 

       ArrayList<BufferedImage> spriteListTerrain = new ArrayList<BufferedImage>(); 
       BufferedImage grass = sprites[0][2]; 
       spriteListTerrain.add(grass); 
       BufferedImage trees = sprites[1][2]; 
       spriteListTerrain.add(trees); 
       BufferedImage mountain = sprites[2][2]; 
       spriteListTerrain.add(mountain); 

       ArrayList<BufferedImage> spriteListOre = new ArrayList<BufferedImage>(); 
       BufferedImage copper = sprites[0][3]; 
       spriteListOre.add(copper); 
       BufferedImage dornite = sprites[1][3]; 
       spriteListOre.add(dornite); 
       BufferedImage kryz = sprites[2][3]; 
       spriteListOre.add(kryz); 
       BufferedImage iron = sprites[3][3]; 
       spriteListOre.add(iron); 
       BufferedImage shallux = sprites[4][3]; 
       spriteListOre.add(shallux); 
       BufferedImage mithril = sprites[5][3]; 
       spriteListOre.add(mithril); 

       ArrayList<BufferedImage> spriteListWood = new ArrayList<BufferedImage>(); 
       BufferedImage oak = sprites[0][4]; 
       spriteListWood.add(oak); 
       BufferedImage olive = sprites[1][4]; 
       spriteListWood.add(olive); 
       BufferedImage rath = sprites[2][4]; 
       spriteListWood.add(rath); 
       BufferedImage yew = sprites[3][4]; 
       spriteListWood.add(yew); 
       BufferedImage eeth = sprites[4][4]; 
       spriteListWood.add(eeth); 
       BufferedImage ebony = sprites[5][4]; 
       spriteListWood.add(ebony); 

       g.drawImage(spriteListTerrain.get((int) (Math.random() * 3)), i* width, j * height, this); //this one works by itself 

       } 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

}

这里是我的问题。为什么当我执行这段代码时,每当我调整窗口大小再重新运行并重新映射我的映射?我认为添加滚动条可能会修复它,但我不知道如何将它们添加进去。我怎样才能阻止它重新循环通过代码每次我调整大小?

谢谢。

回答

2

为什么当我执行此代码,我每次调整窗口再次运行,并重拍我的地图?

您创建地图的代码位于paintComponent()方法中。每次Swing确定组件需要重新绘制时,都会调用此方法。调整框架大小是组件需要重新绘制的一种情况。

因此,您的paintComponent()方法应尽可能高效。你不应该用这种方法做I/O。

你目前的代码对我来说没有多大意义。你有两个使用变量i,j的循环,但是你使用硬编码值来构建ArrayLists。唯一一次使用i,j变量的是drawImage()方法。

所以,我猜想,创建映射的代码应该在外部方法中完成,然后paintComponent()方法应该只在您的循环中调用drawImage(..)。另外,由于drawImage()方法使用random()方法,因此每次调用paintComponent()方法时都会更改图像。这可能不是你想要的,所以实际上你可能需要从外部创建你的整个BufferedImage。然后可以将图像添加到JLabel中,并将标签添加到框架中,因此您不需要在面板上进行自定义绘画。

+0

好吧,所以我一直在重新编写我的代码来尝试这种方法。除了drawImage从来不知道要绘制什么,因为它看起来不可能将任何东西传递到PaintComponent中,所以我试图从paintComponent中除了drawImage之外的所有东西。 另外,我的地图制作程序的全部内容都是随机地图。如果我摆脱了在绘制代码中的随机性,它绝不会做我想要的。 我的代码很混乱,但是你的建议使得它更没有意义。 – sekimberly52 2012-02-14 15:03:44

+0

甚至超出了所有的东西,你怎么称之为paintComponent方法?它总是抱怨Graphics g没有被定义,但是我敢肯定,在系统刚刚运行该方法并且默认情况下,它永远不能真正定义它。 – sekimberly52 2012-02-14 15:08:28

+0

我假设你有一个名为“createMap”的方法。这应该在缓存的图像上创建随机地图。这个缓冲图像然后被绘制在paintComponent()方法中。如果你想改变地图,那么你需要再次调用“createMap”方法。映射的随机化不应该在paintComponent()方法本身中完成。强制重绘组件的repaint()方法。也许从[自定义绘画方法](http://tips4java.wordpress.com/2009/05/08/custom-painting-approaches/)中的“绘制图像”示例将有助于了解基础知识。 – camickr 2012-02-14 15:58:05

2

将感兴趣的对象绘制到BufferedImage并放在标签中。请注意,它不会自动调整大小。

或者,您可以将对象绘制到BI并将其缩放到框架大小。这只有在需要很长时间才能构建时才有意义。


ID具有所有这些保存到一个大的BI,这我不知道该怎么办。

显然你明白如何处理一个Graphics对象。可以使用getGraphics()createGraphics()从BI获得。

+0

如果我这样做,我将不得不以某种方式将80 BI凝聚成一个BI。我的代码遍历并且每64个像素放置一个新的BI,直到它到达行的末尾。因此,ID必须将所有这些保存到一个大型商业智能中,而我不知道该怎么做。 – sekimberly52 2012-02-12 15:47:28

+0

查看编辑以回答。 – 2012-02-12 15:51:50

+0

+1,首先绘制到BufferedImage。 – camickr 2012-02-12 16:01:57