2012-05-01 7 views
-2

좋아요, 그렇기 때문에 JFrame에 64 JButton의 배열을 추가하고 8x8 격자 레이아웃 (체스 보드 유형의 것)을 추가하려고합니다.Java for 루프가 제대로 완료되지 않았습니다.

public class othello implements ActionListener{ 
int [][] board = new int[8][8]; 
JFrame window = new JFrame(); 
JButton[] buttons = new JButton[64]; 

public othello(){ 

window.setSize(400,400); 
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
window.setLayout(new GridLayout(8,8)); 
window.setVisible(true); 
    for (int i=0;i<64;i++){ 
     buttons[i] = new JButton(""); 
     buttons[i].addActionListener(this); 
     window.add(buttons[i]); 
    } 
    for (int i=0;i<8;i++){ 
     for (int j=0;j<8;j++){ 
      board[i][j]=2; 
     } 
    } 
    board[3][3]=0;board[4][4]=0; 
    board[3][4]=1;board[4][3]=1; 
} 

public void actionPerformed(ActionEvent e){ 
    for (int i=0;i<8;i++){ 
     for (int j=0;j<8;j++){ 
      if(e.getSource()==buttons[i]){ 
       buttons[i].setEnabled(false); 
       board[i][j]=1; 
       check(); 
      } 
     } 
    } 
} 

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

}

어떤이 코드가 결과하는 것은 실제로 추가되는 버튼의 겉보기에 임의의 숫자입니다 : 여기에 관련 코드 섹션입니다. 가끔은 64 개 모두를 더하고, 더 일반적으로 절반 정도를 추가합니다. 항상 제대로 시작하지만 임의의 지점에서 멈 춥니 다 (버튼 라벨을 카운트하여 테스트했습니다).

루프 자체가 실제로 완료 되었는 지 확인하기 위해 println을 추가했습니다. 아무런 문제가 없습니다. 루프가 64 번 반복되며, 어느 시점에서 버튼이 추가되지 않습니다.

저는 Java에서 초보자가되어서 정말 간단하고 어리석은 것이라고 확신합니다. 그러나 현재 어떤 문제가 있는지 전혀 알지 못합니다. 누구든지 도와 줄 수 있습니까?

더 많은 코드 용으로 편집 됨.

+0

그냥 화면에서 버튼을 추가하는 것이 아니라 볼 수 있습니까? 더 많은 코드가 없으면 아마 당신을 도울 수 없을 것입니다. 'window'는 어떻게 정의되어 있습니까? – edthethird

+3

'버튼'이란 무엇입니까? (List, ArrayList 등) –

+1

프로그램이 예외없이 종료 되었습니까? – monksy

답변

1

배열을 초기화 했습니까? like

JButton[] buttons = new JButtons[x]; 

일부 인쇄물을 확인하여 루프가 멈추는 횟수를 확인하십시오.

+0

"루프 자체가 실제로 완료 되었는 지 확인하기 위해 println을 추가했습니다. 아무런 문제가 없습니다. 루프가 64 번 반복되며, 어떤 시점에서 버튼을 추가하지 않습니다." – SLS

+0

이미 해결하셨습니까? –

0

아마도 UI를 조작하기 위해 event dispatch thread을 사용하고 있지 않습니까? Swing Tutorial에서

: 모든 이벤트 처리 코드가 실행

이벤트 발송 쓰레드. Swing 프레임 워크와 상호 작용하는 대부분의 코드는 이 스레드에서 실행되어야합니다.

SwingUtilities.invokeAndWait()을 사용하여 UI 구성 코드를 실행 해보십시오.

편집 : 수정 된 소스 코드는 다음과 같습니다

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class othello implements ActionListener 
{ 
    int[][] board = new int[8][8]; 
    JFrame window = new JFrame(); 
    JButton[] buttons = new JButton[64]; 

    public othello() 
    { 
     try 
     { 
      SwingUtilities.invokeAndWait(new Runnable() 
      { 
       public void run() 
       { 
        window.setSize(400, 400); 
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        window.setLayout(new GridLayout(8, 8)); 
        window.setVisible(true); 
        for (int i = 0; i < 64; i++) 
        { 
         buttons[i] = new JButton(""); 
         buttons[i].addActionListener(othello.this); 
         window.getContentPane().add(buttons[i]); 
        } 
        for (int i = 0; i < 8; i++) 
        { 
         for (int j = 0; j < 8; j++) 
         { 
          board[i][j] = 2; 
         } 
        } 
        board[3][3] = 0; 
        board[4][4] = 0; 
        board[3][4] = 1; 
        board[4][3] = 1; 
       } 
      }); 
     } 
     catch (Exception e) 
     { 
      // TODO Handle exception 
      e.printStackTrace(); 
     } 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     for (int i = 0; i < 8; i++) 
     { 
      for (int j = 0; j < 8; j++) 
      { 
       if (e.getSource() == buttons[i]) 
       { 
        buttons[i].setEnabled(false); 
        board[i][j] = 1; 
        // check(); 
       } 
      } 
     } 
    } 

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

} 
+0

고마워, 그 트릭을 한거야. println에서 나는 어떤 일이 일어나지 않았는 지 막연한 느낌을 주었지만 나는 코드에 링크를 만들 수있는 단계에 있지 않습니다. – SLS

0
당신은 다른 모든 톱 레벨의 컨테이너를 스윙/JFC하는과 마찬가지로 JFrame.add()

에없는 직접 contentPane에 추가해야

JFrame은 유일한 자식으로 JRootPane을 포함합니다. 루트 창에서 제공되는 콘텐츠 창에는 원칙적으로 JFrame에 표시된 인 모든 비 메뉴 구성 요소가 포함되어야합니다.

레이아웃 관리자를 기본값 이외의 값으로 설정 하시겠습니까?

기본 컨텐츠 창의 BorderLayout 관리자가 설정됩니다. JFrame의 LayoutManager 추가, 제거 및 설정에 대한 자세한 내용은 RootPaneContainer를 참조하십시오.다음과 같은 내용을 추가 할 수

적절한 관용적 인 코드는 다음과 같습니다

window.getContentPane().add(child); 

적절한 사용에 대한 자세한 내용은 Javadoc를 참조하십시오.

관련 문제