2014-12-03 1 views
0

비워두기 위해 JPanel을 흰색으로 표시하는 데 문제가 있습니다. 저는 포커 게임을 만들고 있어요. 모두 한 화면에서 실행되기 때문에 다른 플레이어의 손이 보이지 않도록 액션 사이에 5 초의 포즈를 만들고 싶습니다.임시 공백 JPanel

나는 새로운 선수가 될 때 활성화 된 부울을 가지고 있습니다. 나는 JPanel을 페인트 칠하고, 기다리라는 메시지를 표시하고, 5 초 후에 다시 칠해서 새 플레이어에게 카드를 보여 주어야합니다.

5 초 동안 일시 중지가 진행되는 동안 이전 정보가 화면에 표시됩니다.

public void paintComponent(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 
     super.paintComponent(g2); // call superclass's paintComponent 
     this.setBackground(new Color(0, 153, 51)); 
    if(this.newTurn){ 
      g2.drawString("Starting next turn. . .", 400, 90); //1000,300 
      int[] pointsX = { 0, 1000, 1000, 0 }; 
      int[] pointsY = { 0, 0, 300, 300 }; 
      g2.fillPolygon(pointsX, pointsY, 4); 
      c1 = false; 
      c2 = false; 
      c3 = false; 
      c4 = false; 
      c5 = false; 
      try { 
       Thread.sleep(5000);     //1000 milliseconds is one second. 
      } catch(InterruptedException ex) { 
       Thread.currentThread().interrupt(); 
      } 
      this.newTurn = false; 
      repaint(); 
     } 

이 문제를 해결하려면 어떻게해야합니까? 감사.

+0

글래스 페인 (GlassPane) 패널에 컬러 화이트 트랜스 페란트 색상을 추가하면 충분하다고 생각합니다. 이 질문을보고 스윙 타이머 나 스윙 워커를 사용하십시오. –

답변

4

특히 paintComponent() 메서드에서 Thread.sleep()을 사용하지 마십시오.

이 코드는 GUI가 잠자기 상태가되어 GUI가 다시 그릴 수 없음을 의미합니다.

어떤 종류의 애니메이션을 원하면 Swing Timer을 사용해야합니다. Swing Timer 코드는 paintComponent() 메서드 중 하나에 있으면 안됩니다. Timer는 "next players turn"로직을 호출 할 때 호출해야합니다.

또한 그림 메서드에서 repaint()를 호출하지 마십시오. 페인팅 코드는 구성 요소의 현재 상태를 페인트해야하며 구성 요소의 속성이나 상태를 수정해서는 안됩니다.

표시하려는 메시지가 포함 된 JLabel과 함께 "장식되지 않은 모달 JDialog"만 표시 할 수 있습니다. 따라서 타이머를 시작한 다음 대화 상자를 표시하고 타이머가 실행되면 대화 상자를 숨길 수 있습니다.

+0

하지만 잠자기 전에 GUI를 편집하므로 새로운 빈 GUI를 그리지 않고 잠을 자지 않습니까? 또한 페인트를 칠하는 방법에서 repaint()를 사용하는 것은 페인트를 false로 만드는 조건을 설정하면 정말 큰 거래일까요? –

+0

@WillNasby'paintComponent()'에서하는 그림은 화면으로 직접 이동하지 않고 백 버퍼 (스윙은 더블 버퍼링됨을 기억하십시오)에 연결되므로 그림을 그릴 때도 보이지 않습니다. EDT가 차단되었습니다. – kiheru

+0

@WillNasby'repaint()'와 마찬가지로 - 당신은 마이크로 매니지먼트 드로잉을하지 않습니다. 당신이 그것을 기대하지 않을 때 시스템이 redraws 나 * partial * redraws를 위해'paintComponent()'를 호출 할 수 있으며 이것은 당신의 조건을 망칠 수있다. '타이머'만 사용하는 것이 좋습니다. 올바른 방법입니다. – kiheru