2011-04-01 3 views
3

내 카운터가 4에 도달 할 때마다 나는 비프 음을 재생하고 '1'로 돌아가서 다시 최대 4 카운트하여 비프 음을 울리 길 원한다.Java Swing이 카운터를 작동 시키려면 어떻게해야합니까?

카운터에 전혀 표시되지 않으므로 레이블에 넣지 마십시오. 나는 어떤 오류도 내지 않지만 레이블에 말한다; 카운터는 4이고 아무 것도 계산하지 않습니다.

이 카운터가 제대로 작동하도록 도와 줄 수 있습니까? 나는 또한 printline을 사용했지만 도 약간의 오류를 주었다.

카운터에 대한 나의 코드는 이것이다 :

button1.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent arg0) { 

    label1.setVisible(true); 
    int counter = 1; 

    while(counter < 5) 
    { 
     label1.setText("counter is " + counter); 
     counter = counter + 1 ; 
    } 

    counter = 1; 
    tk.beep(); 
    } 
}); 
+1

무엇이 오류가 발생합니까? –

+1

레이블에 카운터가 4라고 말하면서 어떤 오류도 나타나지 않고 아무런 카운터도 남지 않습니다. – Opoe

+0

레이블의 값을 변경 한 후에'validate()'와'repaint()'를 호출 해보십시오. –

답변

5

GUI를 카운트하고 대기하고 업데이트하려면 새 스레드를 생성하십시오.

GUI를 업데이트하는 유일한 스레드 인 이벤트 발송 스레드에서이 모든 작업을 수행하고 있습니다. 따라서 레이블 텍스트를 설정할 때 메서드가 반환되고 이벤트 발송 스레드가 다시 그리기 작업을 처리 할 때까지 레이블에서 텍스트가 업데이트되지 않습니다.

즉시 실행되는 루프에서 실행하는 대신 새 스레드를 생성해야합니다. actionPerformed 메소드를 대신 처리하는 새 Thread을 생성해야합니다. 루프 사이에서 Thread.sleep 기다리고이 스레드에서 루프, 카운트 및 업데이트 레이블 텍스트를 업데이트하려면 레이블을 다음 값으로 업데이트 할 Runnable을 새로 작성하고 SwingUtilities.invokeLater이라는 이벤트 발송 스레드에 넣으십시오. 이 스레드는 필요할 때까지 백그라운드에서 실행하십시오. 모든 루프를 통해 종료 상태 부울을 검사하고 false로 설정하면 종료하는 것이 좋습니다. 이렇게하면 언제든지 스레드를 완전히 종료 할 수 있습니다. 또는 카운트 다운하고 경고음을 한 번만 울리려면 카운트를 한 번 반복하면 스레드가 끝날 수 있습니다.

스택 오버플로에는 각 단계를 자세히 설명하는 많은 질문이 있으므로 여기에서이 정보를 반복하지 않겠습니다.

+0

감사합니다. 도움이되는 답변에 감사드립니다. – Opoe

+1

+1은'shutdown'을 언급합니다. – Max

0

귀하의 루프는 처음 4 후 중지하고 다시는 호출되지. 텍스트가 빠르게 변하기 때문에 마지막 결과 만 볼 수 있습니다.

int counter = 0; 
while (//when do you want it to stop?) 
{ 
    // print what you want (using (counter % 4) + 1) 
    if ((counter % 4) == 0) 
    { 
     tk.beep(); 
    } 
} 
1

다시 칠해야하는 값을 변경 한 후에는 또한 실제로 타이머를 사용하여 레이블을 변경하고 사운드를 재생할 때 필요한 초를 실제로 계산한다고 가정합니다.

1

어쩌면 이것이 당신이 그것을 재설정 모든 4 버튼을 눌러 intened 무엇을 수행하고 내가 올바르게, 아래의 원하는 것을 이해한다면

loginButton.addActionListener(new java.awt.event.ActionListener() { 

    int counter = 1; 

    public void actionPerformed(ActionEvent arg0) { 

     label1.setVisible(true); 

     if (counter < 5) { 
      label1.setText("counter is " + counter); 
      label1.repaint(); 
      ++counter; 
     } else { 
      counter = 1; 
      tk.beep(); 
     } 
    } 
}); 
+0

repaint()에서 오류가 발생합니다. 무엇을 넣어야합니까? – Opoe

+1

@Oppe, 죄송합니다. 업데이트 해 드리겠습니다. 라벨에 붙어 있어야합니다. – vickirk

+0

도움에 감사드립니다. – Opoe

1

을 울립니다 코드가 목표를 달성해야합니다.

button1.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent arg0) { 

    label1.setVisible(true); 

    Runnable runnable = new Runnable() { 
      int counter =1 ; 

      public void run() { 
       while(true) { 

        while (counter<5) { 
         SwingUtilties.invokeLater(new Runnable() { 
           public void run() { 
            label1.setText("counter is " + counter); 
           } 
         }); 

         counter = counter + 1 ; 
         try { 
          Thread.sleep(1000); 
         }catch(InterruptedException ex) { 
          System.err.println(ex.toString()); 

         }  
        } 
       counter = 1; 
       tk.beep(); 

       } 

      } 
    }; 

    new Thread(runnable).start(); 

}); 
관련 문제