2011-11-06 2 views
2

ive는 JPanels를 사용하여 Reversi 용 기본 GUI를 작성하여 GridLayout에서 보드를 나타냅니다. 조각이 재생되는 순간 클릭 된 사각형이 색상을 변경합니다. 나는 원형 조각을 바꾸고 대신 배경을 똑같이 유지하려고 노력했다.Java Swing을 사용하여 Reversi GUI 용 재생 피스 생성

Ive가 꽤 많이 검색되어이를 수행 할 방법을 찾을 수없는 것 같습니다.

- 편집 됨

생성자의 코드입니다. 조각이 마우스 리스너를 재생하면 바로 보드

Public boardGUI(int num){ 

    game = new reversiGame(num, false); 
    Dimension boardSize = new Dimension(600, 600); 

    numSquares = num; 

    layeredPane = new JLayeredPane(); 
    getContentPane().add(layeredPane); 
    layeredPane.setPreferredSize(boardSize); 
    layeredPane.addMouseListener(this); 

    board = new JPanel(); 
    layeredPane.add(board, JLayeredPane.DEFAULT_LAYER); 

    board.setLayout(new GridLayout(numSquares, numSquares)); 
    board.setPreferredSize(boardSize); 
    board.setBounds(0, 0, boardSize.width, boardSize.height); 

    for (int i = 0; i < (numSquares * numSquares); i++) { 
     JPanel square = new JPanel(new BorderLayout()); 
     square.setBorder(BorderFactory.createLineBorder(Color.black)); 
     square.setBackground(Color.green); 
     board.add(square); 

     int row = (i/numSquares); 
     int col = (i % numSquares); 

     if ((row + 1 == numSquares/2 & col + 1 == numSquares/2) || row == numSquares/2 & col == numSquares/2){ 
      square.setBackground(Color.white); 
     } 

     if ((row + 1 == numSquares/2 & col == numSquares/2) || row == numSquares/2 & col + 1 == numSquares/2){ 
      square.setBackground(Color.black); 
     } 
    } 
} 

에게

public void updateBoard(){ 
    int x = 0; 
    int y = 0; 

    ImageIcon black = new ImageIcon("Images/large-black-sphere.ico"); 
    ImageIcon white = new ImageIcon("Images/large-white-sphere.ico"); 
    for(int i = 0; i < numSquares; i++){ 
     for(int j = 0; j < numSquares; j++){ 

      x = i * (600/numSquares); 
      y = j * (600/numSquares); 
      Component c = board.findComponentAt(x, y); 
      GridType g = game.getGridType(i, j); 

      if (g.equals(GridType.WHITE)){ 
       JPanel temp = (JPanel) board.getComponent(i + j); 
       piece = new JLabel(white); 
       temp.add(piece); 
       //c.setBackground(Color.white); 
      } 
      else if(g.equals(GridType.BLACK)){ 
       JPanel temp = (JPanel)board.getComponent(i + j); 
       piece = new JLabel(black); 
       temp.add(piece); 
       //c.setBackground(Color.black); 
      } 
      else{ 
       //c.setBackground(Color.GREEN); 
      } 



     } 
    } 

} 
+6

사용중인 코드 또는 우리를 도울 수있는 코드를 보여주십시오. 정보가 충분하지 않습니다. – Deco

+1

한 가지 방법은 JPanel 또는 다른 JComponent의 paintComponent 메소드에서 타원을 그리거나 그리지 않는 것입니다. 요점은 게임 로직을 게임 GUI와 분리하고 논리 또는 모델을 기반으로 어떤 원을 그려야하는지 결정하는 것입니다. –

답변

2

게임 보드의 각 그리드의 JLabel을 추가 updateBaord 기능을 업데이트합니다. 그런 다음 아이콘을 사용하여 반전 조각을 나타낼 수 있습니다. 그런 다음 반전 조각을 변경하려면 레이블의 아이콘을 변경하십시오.

여기 체스 보드 예제 : How do I make my custom Swing component visible?은 어떻게 수행 될 수 있는지 보여줍니다.

+0

필자의 GUI에서 updateBoard 함수를 변경하여 ImageIcon을 사용하여 생성 된 JLabel을 추가했습니다. 그러나 실행할 때 나타납니다. 이견있는 사람? – CNevin561

+0

@ CNevin561, 코드가 내 코드와 다른 점은 무엇입니까? 나는 완벽한 예제를 게시했다. 새 레이블을 만들지 말고 아이콘을 바꿀 것을 제안했습니다. – camickr

2

... ImageIcon을 사용하고 있는데, 실행하면 표시되지 않습니다.

repaint()을 호출해야 할 수 있습니다. ColorIconMVCGame으로 지정하십시오.

가까이에서 볼 때 updateBoard() 메서드는 기존 레이블을 제거하거나 패널 레이아웃의 유효성을 검사하지 않고 기존 패널에 새 레이블을 추가하는 것으로 나타납니다. 대신 Icon을 제자리에 업데이트하십시오.

관련 문제