2014-09-29 5 views
1

이 프로그램은 페인트 격자 위에서 셀룰러 자동 시뮬레이션 (Conway의 삶의 게임으로 생각하는)을 실행하고, 시작/일시 중지 버튼을 사용하여 실행중인 시뮬레이션을 시작/일시 중지합니다 1 초 간격으로 내가 말할 수있는 한 그리드 그리기 (GUI의 나머지 부분)를 제외한 모든 것은 잘 작동한다.자바 스윙 : 그리드 그리기

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ConcurrentModificationException; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 


public class CA_DriverV2 extends JFrame{ 

    private static final Color white = Color.WHITE, black = Color.BLACK; 

    private Board board; 
    private JButton start_pause; 

    public CA_DriverV2(){ 

     board = new Board(); 
     board.setBackground(white); 

     start_pause = new JButton("Start"); 
     start_pause.addActionListener(board); 

     this.add(board, BorderLayout.NORTH); 
     this.add(start_pause, BorderLayout.SOUTH); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.setSize(300, 300); 
     this.setVisible(true); 

    } 

    public static void main(String args[]){ 
     new CA_DriverV2(); 
    } 

    private class Board extends JPanel implements ActionListener{ 

     private final Dimension DEFAULT_SIZE = new Dimension(5, 5); 
     private final int DEFAULT_CELL = 10, DEFAULT_INTERVAL = 1000, DEFAULT_RATIO = 60; 

     private Dimension board_size; 
     private int cell_size, interval, fill_ratio; 
     private boolean run; 
     private Timer timer; 

     private Color[][] grid; 

     public Board(){ 
      board_size = DEFAULT_SIZE; 
      cell_size = DEFAULT_CELL; 
      interval = DEFAULT_INTERVAL; 
      fill_ratio = DEFAULT_RATIO; 
      run = false; 

      //Initialize grid with random values 
       //NOTE: Add JOptionPane for option to define fill rate and board size? 
       //ALT: Have a resize(int h, int w) method to resize grid when needed. 
       //ALT: Have refill(int r) method to restart with different fill ratio. 
      grid = new Color[board_size.height][board_size.width]; 
      for (int h = 0; h < board_size.height; h++) 
       for (int w = 0; w < board_size.width; w++){ 
        int r = (int)(Math.random() * 100); 
        if (r >= fill_ratio) 
         grid[h][w] = black; 
        else grid[h][w] = white; 
       } 

      timer = new Timer(interval, this); 
     } 

     @Override 
     public Dimension getPreferredSize(){ 
      return new Dimension(board_size.height, board_size.width); 
     } 

     @Override 
     public void paintComponent(Graphics g){ 
      for (int h = 0; h < board_size.height; h++) 
       for (int w = 0; w < board_size.width; w++){ 
        try{ 
         if (grid[h][w] == black) 
          g.setColor(black); 
         else g.setColor(white); 
         g.fillRect(h * cell_size, w * cell_size, cell_size, cell_size); 
        } catch (ConcurrentModificationException cme){} 
       } 
     } 

     public void actionPerformed(ActionEvent e) { 

      //Timer tick processing 
      if (e.getSource().equals(timer)){ 
       repaint(); 
       Color[][] newGrid = new Color[board_size.height][board_size.width]; 
       for (int h = 1; h < board_size.height; h++) 
        for (int w = 1; w < board_size.height; w++) { 
         int surrounding = 0; 
         //Count black neighbors 
         for (int i = -1; i <= 1; i++) 
          for (int j = -1; j <= 1; j++){ 
           if(i != 0 && j != 0){ 
            try{ 
             if(grid[h + i][w + j] == black) 
              surrounding++; 
            } catch(ArrayIndexOutOfBoundsException ae){} 
           } 
          } 



         //Generate next iteration 
         if (surrounding > 5 || surrounding < 2) 
          newGrid[h][w] = black; 
         else newGrid[h][w] = white; 
        } 
       for (int h = 1; h < board_size.height; h++){ 
        for (int w = 1; w < board_size.height; w++){ 
         grid[h][w] = newGrid[h][w]; 
         System.out.print(grid[h][w] + " "); 
        } 
        System.out.println(); 
       } 
       System.out.println(); 
      } 

      //Start-Pause button processing 
      else if(e.getSource().equals(start_pause)){ 
       if(run){ 
        timer.stop(); 
        start_pause.setText("Pause"); 
       } 
       else { 
        timer.restart(); 
        start_pause.setText("Start"); 
       } 
       run = !run; 

      } 
     } 
    } 
} 

이 버튼의 은색으로 오버레이 초기 그리드의 은색처럼 보이는 매우 상단에 뭔가를 출력하고, 나머지는 기본 회색이다.

+0

catch (ArrayIndexOutOfBoundsException ae) {}'- 절대 절대로하지 마십시오. 진지하게. –

답변

2

보드 변수가 추가되었습니다. BorderLayout.NORTH는 BorderLayout.CENTER가 아니므로 상위 5 픽셀 만 채 웁니다.

catch(ArrayIndexOutOfBoundsException ae){} 

뿐만 아니라

당신이 예외를 무시하지 말아야하지만, 당신도 예외 유형을 잡을해야합니다

그리고 내 의견에 따라

, 당신은 당신의 프로그램에서 같은 코드를해서는 안됩니다. 대신 가장자리를 다룰 수 있도록 for 루프를 약간주의해서 만드십시오.

또한 클래스 재정의에서 super.paintComponent(g) 메서드를 호출하는 것을 잊지 마십시오.