2012-04-27 2 views
1

좋아요. 그래서 간단한 반응 게임을 만들고 있고 코드는 아래와 같습니다. 이제 startGame()이 호출 될 때 while 루프를 주석 처리하면 모든 것이 정상적으로 처리되지만 thread.sleep (1000)을 사용하여 실행하면 문제가 생깁니다. 전체 프로그램이 실행되고 아무 일도 일어나지 않습니다. 코드를 실행하고 디버깅하는 데 2 ​​분이 걸립니다. 나는 사용자가 점등 된 jPanelArray JPanel을 클릭 할 수 있는지 확인하기 위해 thread.sleep (1000)을 사용하고있다. 하지만 나는 게임 시작 단추를 누를 때 GUI가 AT 모두를 바꾸지 않는 thread.sleep 때문에 믿습니다. 도움말 정말 고맙습니다.자바 GUI가 바뀌지 않습니다.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.Random; 

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

public class JExternFrame extends JFrame implements ActionListener{ 
    public Color randomColor(){ 
     return new Color((.8f) * generator.nextFloat() + .04f,(.8f) * generator.nextFloat() + .04f,(.8f) * generator.nextFloat() + .04f); 
    } 
    public JPanel [][]jPanelArray; 
    public JButton startButton; 
    int []currentLitUp; 
    public Random generator; 
    public JPanel main; 
    public JExternFrame(){ 
     super("The Reaction Game"); 
     generator = new Random(); 
     setSize(400,400); 
     startButton = new JButton("Start Game"); 
     startButton.setOpaque(true); 
     startButton.setBorderPainted(false); 
     startButton.setBackground(randomColor()); 
     add(startButton,BorderLayout.NORTH); 
     main = new JPanel(); 
     main.setBackground(randomColor()); 
     add(main); 
     mouseClick myMouseClick = new mouseClick(); 
     startButton.addActionListener(this); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     } 
    public void startGame(){ 
     startButton.setVisible(false); 
     int numOfClicks = generator.nextInt(8)+5; 
     int sizeX = 15; 
     int sizeY = 15; 
     currentLitUp = new int[2]; 
     jPanelArray = new JPanel[sizeX][sizeY]; 
     mouseClick mouseClicked = new mouseClick(); 
     main.setLayout(new GridLayout(sizeX,sizeY)); 
     for(int i = 0; i < sizeX; i++){ 
      for(int j = 0; j < sizeY; j++){ 
       jPanelArray[i][j] = new JPanel(); 
       jPanelArray[i][j].setBackground(Color.GRAY); 
       main.add(jPanelArray[i][j]); 
       jPanelArray[i][j].addMouseListener(mouseClicked); 
      } 
     } 
     while (numOfClicks != 0){ 
      numOfClicks--; 
      currentLitUp[0] = generator.nextInt(14); 
      currentLitUp[1] = generator.nextInt(14); 
      jPanelArray[currentLitUp[0]][currentLitUp[1]].setBackground(randomColor()); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      jPanelArray[currentLitUp[0]][currentLitUp[1]].setBackground(Color.GRAY); 
      currentLitUp[0] = -1; 
      currentLitUp[1] = -1; 
     } 
     System.exit(0); 
    } 
    public class mouseClick implements MouseListener{ 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      if(e.getSource() == jPanelArray[currentLitUp[0]][currentLitUp[1]]){ 
       System.out.print("Correct"); 
      } 
      else System.out.print("INCORRECT"); 

     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

    } 
    public void actionPerformed(ActionEvent e){ 
     if(e.getSource() == startButton){ 
      startGame(); 
     } 
    } 
    public static void main(String[] args){ 
     new JExternFrame(); 
    } 
} 

답변

3

귀하의 actionPerformed() 방법은 Event Dispatch Thread에 스윙에 의해 호출 ...이 질문에 걸쳐 여러 번 대답 찾을 수 있습니다. actionPerformed() 메서드에서 startGame()을 호출하면이 메서드는 계속 반복됩니다. 즉, Event Dispatch Thread가 작업을 계속할 수 없게됩니다.

SwingWorkerSwingUtilities.invokeLater()을 조사해야합니다.

4

Thread.sleep()이 GUI 스레드에서 실행 중이고 잠자기 상태가되어 다른 GUI 이벤트 처리를 계속할 수 없습니다. 스윙에서

Concurency이 문제입니다, 당신은

관련 문제