2012-02-12 3 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, j, но вы создаете ArrayLists, используя жестко закодированные значения. Единственный раз, когда вы используете переменную i, j для метода drawImage().

Итак, я бы предположил, что код для создания карты должен выполняться внешним методом, а затем метод paintComponent() должен вызывать drawImage (..) только внутри ваших циклов.

Кроме того, поскольку метод drawImage() использует метод random(), каждый раз, когда вызывается метод paintComponent(), вы будете изменять изображение. Это, вероятно, не то, что вы хотите, так что на самом деле вам, вероятно, необходимо создать весь BufferedImage извне. Затем изображение можно добавить в JLabel и добавить ярлык к фрейму, чтобы вам не нужна индивидуальная покраска на панели.

+0

Хорошо, поэтому я переделал свой код, чтобы попробовать этот метод.Ive пытался получить все из paintComponent, за исключением drawImage, за исключением того, что drawImage никогда не знает, что рисовать, потому что кажется невозможным передать что-либо в PaintComponent. Кроме того, весь пункт моей программы создания карты состоял в том, чтобы иметь случайную карту. если я избавлюсь от случайного в коде draw, он никогда не сделает то, что я хочу. Мой код был путаным, но то, что вы предлагаете, имеет еще меньший смысл. – sekimberly52

+0

Что я не понимаю даже за пределами всего, что вы называете методом paintComponent? Он всегда жалуется на то, что Graphics g не определяется, но я уверен, что вы никогда не сможете определить его до тех пор, пока система не запустит этот метод и не сделает его по умолчанию. – sekimberly52

+0

Я предполагаю, что у вас есть метод под названием «createMap». Это должно создать случайную карту на буферизованном изображении. Это буферизованное изображение затем окрашивается в метод paintComponent(). Если вы хотите изменить карту, вам нужно снова вызвать метод createMap. Рандомизация карты НЕ должна выполняться в самом методе paintComponent(). Сила перекраски компонента, вызываемого методом repaint() компонента. Может быть, пример «Нарисовать изображение» из [Custom Painting Approaches] (http://tips4java.wordpress.com/2009/05/08/custom-painting-approaches/) поможет с основами. – camickr

2

Нарисуйте интересующие объекты на BufferedImage и разместите их на этикетке. Обратите внимание, что он не будет автоматически изменяться.

Альтернативно вы можете нарисовать объекты в BI и просто масштабировать его до размера рамки. Это будет иметь смысл, если потребуется много времени.


идентификатор должен спасти всех тех, кто в один большой BI, который я не знаю, как это сделать.

Видимо вы понимаете, как бороться с объектом Graphics. Можно получить из BI, используя либо getGraphics(), либо createGraphics().

+0

Если бы я сделал это, мне пришлось бы как-то сконденсировать 80 BI в один BI. Мой код проходит цикл и помещает новый BI каждые 64 пикселя, пока он не достигнет конца строки. Таким образом, идентификатор должен сохранить все это в одном большом BI, который я не знаю, как это сделать. – sekimberly52

+0

См. Править для ответа. –

+0

+1, для рисования сначала BufferedImage. – camickr

Смежные вопросы