2013-05-11 5 views
1
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.image.BufferedImage; 
import java.io.Console; 
import java.util.Scanner; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 


public class CA extends JComponent{ 

    int[] cells; 
    int[] ruleset; 
    int w = 10; 
    int generation = 0; 
    int width = 600; //Pixel length of the window 
    private BufferedImage caImage; 

    CA() 
    {  
     cells = new int[width/w]; 
     //Rule 90 of Wolfram 
     ruleset = new int[]{0,1,0,1,1,0,1,0}; 


     for (int i = 0; i < cells.length; i++) 
      cells[i] = 0; 

     cells[cells.length/2] = 1; 
     print(cells, cells.length); 
     generate(); 
    } 

    public void generate() 
    { 
     int [] nextgen = new int[cells.length]; 

     while(generation<6) 
     { 

      for(int i=1; i<cells.length-1; i++) 
      { 
       int left = cells[i-1]; 
       int middle = cells[i]; 
       int right = cells[i+1]; 
       nextgen[i] = rules(left, middle, right); 
      } 
      cells = nextgen; 

      print(cells, cells.length); 
      System.out.println(); 

      paintComponent(this.getGraphics()); 
      generation++; 
     } 
    } 

    public void print(int[] a, int length) 
    { 
     System.out.println(); 
     for(int i=0; i<length; i++) 
     { 
      System.out.print(a[i]+" "); 
     } 
    } 

    public int rules(int a, int b, int c) 
    { 
     String s = ""+a+b+c; 
     int index = Integer.parseInt(s, 2); 
     return ruleset[index]; 
    } 


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

     Graphics2D g2 = (Graphics2D) g; 
     for(int i=0; i<cells.length; i++) 
     { 
      if(cells[i] == 0)  
      { 
       Color color = Color.WHITE; 
       g2.setColor(color); 
      } 

      else if(cells[i] == 1) 
      { 
       Color color = Color.BLACK; 
       g2.setColor(color); 
      } 

      //Rectangle rect = new Rectangle(i*w, generation*2, w, w); 
      //g2.fill(rect); 
      g2.drawRect(i*w, generation*2, w, w); 
     } 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     JFrame frame = new JFrame(); 
     frame.setSize(600, 600); 
     frame.setTitle("Cellular Automaton"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setBackground(Color.RED); 
     frame.setVisible(true); 

     //Scanner input = new Scanner(System.in); 
     //String pause = input.nextLine(); 



     CA cellularAutomaton = new CA(); 
     frame.add(cellularAutomaton); 
     frame.setVisible(true); 

    } 

} 

Я хочу отображать прямоугольники белого или черного цвета размером 10x10 пикселей, получая 1 или 0 из 1D массива из 60 элементов. Я повторяю ту же операцию 6 раз для разных обновленных элементов массива 1D. (Реализация клеточных автоматов).Graphics2D: null указатель исключение при настройке цвета

Проблема: Проблема возникает, когда я хочу отобразить результат на окнах размером 600x600. Линия g2.setColor(Color) выбрасывает NullPointerException. Я не мог найти причину возникновения этой ошибки.

ответ

4

Ваш объект Graphics имеет значение NULL. Не вызывайте getGraphics() на компонент, чтобы получить экземпляр Graphics, поскольку он не будет сохраняться. Это нормально, когда вы вызываете это в BufferedImage, но если вы получите его из компонента, то он станет нулевым с любой перерисовкой. Вместо этого используйте экземпляр Graphics, который JVM предоставляет вам в параметре метода paintComponent(...) или экземпляре Graphics из BufferedImage.

Кроме того, не вызывайте напрямую paintComponent(...). Это работа JVM.

Кроме того, ваш цикл while не будет работать, так как он свяжет и заблокирует Swing Event Dispatch Thread или EDT. Вы должны использовать SwingWorker для генерации BufferedImage в фоновом потоке, а затем отображать изображение, созданное в потоке событий Swing.

+0

+1 Кроме того, не вызывайте paintComponent() напрямую. – camickr

+0

@camickr: спасибо, понял! :) –

+0

Использование SwingWorker очень умно, чтобы ваш графический интерфейс не зависел, +1. Бесценный совет. – skuntsel