2012-02-12 66 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