2010-02-20 4 views
1

나는 체스 게임을위한 GUI 작업을하고 있는데, 예를 들어 일련의 클릭을 확인하는 방법이 있는지 궁금합니다. 사용자가 jPanel을 클릭 한 다음 사용자 클릭 유효한 이동 배열에있는 다른 jPanel에. "isSquareClicked = true"와 같은 일종의 상태를 저장하기 위해 변수를 사용할 수 있다는 것을 알고 있습니다. 그러나 유일한 방법이 아니라면 차라리 그렇게하지 않을 것입니다 ...자바 스윙 GUI에서 일련의 클릭 확인하기

답변

2

JPanels 사용에 문제가없는 것 같습니다. 이제 메인 보드 패널

public class ChessSquare extends JPanel{ 
    int x,y; 

    public ChessSquare(int x, int y){ 
     super(); 
     this.setPreferredSize(new Dimension(50,50)); 
     this.setBorder(BorderFactory.createLineBorder(Color.black)); 
     this.x = x; 
     this.y = y; 
    } 
} 

:

가 먼저 ChessSquare, 이것은 보드에 하나의 셀 대표 : 여기 내 구현의

public class ChessPanel extends JPanel{ 
    JPanel positions[][] = new JPanel[8][8]; 
    ChessSquare move[] = new ChessSquare[2]; 

    public ChessPanel(){ 
     initComponents(); 
    } 

    private void initComponents(){ 
     setLayout(new GridLayout(8,8)); 

     for(int i=0;i<positions.length;i++){ 
      for(int j=0;j<positions[i].length;j++){ 
       ChessSquare square = new ChessSquare(i,j); 
       square.addMouseListener(new MouseListener(){ 
        public void mouseClicked(MouseEvent me) { 
         ChessSquare cs = (ChessSquare)me.getComponent(); 
         if(isValidMove(cs)){ 

          System.out.println("Valid move!"); 
          System.out.println("x1: "+move[0].x+" y1: "+move[0].y); 
          System.out.println("x2: "+move[1].x+" y2: "+move[1].y); 
          System.out.println(""); 

          resetMove(); 
         } 
        } 

        //Other mouse events 

       }); 
       positions[i][j] = square; 
       add(square); 
      } 
     } 
    } 

    private boolean isValidMove(ChessSquare square){ 
     //here you would check if the move is valid. 
     if(move[0] == null){ 
      move[0] = square; 
      return false; //first click 
     }else{ 
      move[1] = square; 
     } 

     //Other chess rules go here... 
     return true; 
    } 

    private void resetMove(){ 
     move = new ChessSquare[2]; 
    } 
} 

우리는 보드를 표현하기 위해 JPanel의 행렬을 유지를, 현재 이동을 나타내는 ChessSquare 배열. isValidMove()에서 현재 이동이 완료되었는지 확인합니다 (두 사각형이 모두 클릭되어 이동 배열에 이미 하나의 요소가 있음). 이동이 완료되면 이동을 재설정하고 다시 시작합니다.

+0

또한 클릭 처리 코드를 단순화하여 사각형에 개별 구성 요소를 선호합니다. 약간 더 세게 만드는 것은 사각형 사이의 애니메이션입니다. –

+0

사각형 사이의 애니메이션은 GlassPane을 확인하십시오. 유리 창은 프레임 위에있는 유리 시트와 같으며,이를 사용하여 구성 요소 사이의 맞춤 애니메이션 (이 경우 사용자의 사각형)을 페인트 할 수 있습니다. – Cesar

1

아시다시피, Java에는 그런 것이 없습니다. .

그러나 :

1) 내가 알고있는 것처럼, 당신은 게임 필드를 만들 8 * 8 JPanel의의 필드를 사용? IMHO 이것은 나쁜 방법입니다. 내가 너라면 필자는 필드 만들기를 위해 하나의 패널을 사용한다. 모든 패널 (셀, 인물 등)을 칠한다. 이것은 더 간단하고, 생성 속도가 빠르고, 작업하기 쉽습니다.

2) 질문에 다시 회신하십시오. 필드에 대해 하나의 패널이있는 경우 좌표의 쌍을 기억하면됩니다. 첫 번째 클릭 위치는 두 번째입니다. 귀하의 경우 - 클릭 한 패널에 2 개의 포인터가 충분합니다. ;)

희망이 도움 :)

+0

간단한 아이디어입니다. –

1

내가 꼬마 도깨비에 동의 - 당신은 아마 단일 JPanel에 있고 하나 개 패널의 모든 것을 그리려. 누군가가 이미 8 * 8 JPanel의와 체스 판을 구현하고 사용하라고했다면

말했다되는 것을, 나는 처리하기 위해 모든 위에 하나의 투명 인 JPanel을의 JLayeredPane에서 8 × 8 JPanel의 퍼팅 후 퍼팅 시도 할 수 있습니다 모든 마우스 클릭.

여전히이 접근법은 포인트 연산을 통해 어떤 셀이 클릭되는지 파악해야하며, 8x8 JPanels 사용의 요점은 처음.