2012-01-08 3 views
1

문제가 있습니다. 루프를 사용하여 무언가를 그립니다. 실행을 일시 중지하려면 Sleep을 사용합니다. 그 사이에, 나는 라인이 많은 textArea를 볼 수 있기를 원합니다. 나는 그들을 볼 수있게 아래로 스크롤해야합니다.하지만 나는 할 수 없습니다. Sleep을 사용하면 불가능합니다. 제안 사항이 있으십니까? 감사합니다. .루프를 일시 중지했지만 여전히 텍스트를 볼 수 있습니다.

+0

루프가 수행중인 모든 작업을 다른 스레드로 처리해야합니다. 이 질문에 근거하여 사람들이 대답하기가 어려울 것입니다.타이머를 호출 할 때마다 타이머를 만들고 루프 의무를 수행하는 것이 좋습니다 (수면 시간과 동일한 간격으로 타이머를 설정하십시오). . 잠자기 전에 루프를 두 번 이상 수행 한 경우 타이머 호출 중에 여러 번 루프를 수행하십시오. –

+0

** 스레드 **를 사용하십시오. –

답변

1

이벤트 스레드에서 절전 모드를 사용하지 마십시오. 나는 당신이 Swing 응용 프로그램이라고 가정합니다 (이것이 맞는지 아닌지를 알려주세요). 그렇다면 이벤트 스레드에서 Thread.sleep(...)을 호출하면 전체 GUI가 잠자기 상태가되어 반응이 없습니다. 대신, Swing 응용 프로그램 인 경우 스윙 타이머를 사용하십시오.

자습서 : How to Use Swing Timers

편집 한
참고 :이 SwingWorker를를 사용하는 여기에 많은 권장하며,이 유용 할 수 있지만, 필요한 코드가 수행 할 않는 내가 그들을 사용하여 보류 것 시간 격차 사이의 시간은 매우 CPU 집약적이며 중간에서 큰 파일 읽기와 같이 완료하는 데 약간의 시간이 걸립니다. 모두 원을 그린 다음 일시 중지하고 다른 원을 그리는 경우 SwingWorker는 지나치게 잔인하며 구현하기가 훨씬 쉬운 Swing Timer도 갈 수 있습니다.

모든 권장 사항과 마찬가지로 답변은 문제의 특성에 따라 다르며 더 자세히 알려주십시오.

+0

@ ada90 : 편집 1을 참조하십시오. 편집에 대한 –

+0

+1, 그가 언급 한 의견에서 그는 (EDT에서 발생해야하는) 일부 그림을 그리기 만하고 다음 페인트가 오기까지 잠시 기다려야 만합니다. – Robin

+0

@Robin 감사합니다. +1도 훌륭한 대답입니다. –

0

기본적으로 루프 상태 (예 : 등)를 기억하고 추가를 중단해야합니다. 사용자가 스크롤 할 수있게하고, "일시 중지 해제"할 때 루프를 다시 시작할 수 있습니다.

또는 SwingWorker 등을 사용하여 별도의 스레드에서 루핑을 수행하여 UI 스레드에 마샬링하여 UI에 영향을주고 다른 스레드에서 잠자기합니다. 그것은 UI에 영향을 미치지 않습니다. 그것은 꽤 까다롭게 될 가능성이 높습니다.

0

불행히도 코드 스 니펫을 게시하지 않았으며 문자 영역을 아래로 스크롤 할 수 없다는 것이 무엇인지 명확하게 설명하지 않았습니다.

그러나 나는 UI 스레드에서 sleep()을 호출하기 때문에 UI가 고정되어 있다고 가정 할 수 있습니다. 아마도 그것은 오버로드 된 paint() 또는 repaint() 메소드에서 호출되었을 것입니까? 내 추측이 맞다면 별도의 스레드에서 루프와 수면을 시도하십시오. 아마도 SwingWorker을 사용할 수 있습니다.

자세한 내용을 알려면 자세한 정보가 필요합니다.

+0

필자는 패널에 무언가를 칠해 보겠습니다. 6 개의 원을 말하며 각각에 대해 몇 가지 정보가 있습니다. 또 다른 패널에는 textArea가 포함되어 있습니다. 루프가 일시 중지되면 다른 패널에서 textArea를 클릭하고 끝까지 스크롤 할 수 있기를 원합니다. – sonya

1

UI 스레드에서 sleep으로 전화하면 안됩니다. 이는 방금 발견 한 모든 UI 관련 작업을 차단하기 때문에 발생합니다.

UI의 일반적인 유스 케이스는 작업자 스레드 (예 : SwingWorker 클래스에서 제공됨)에서 많은 작업을 수행하고 작업이 완료되면 (또는 일정 간격으로 진행률을 표시하기 위해) UI를 업데이트하는 것입니다. .

특정 간격으로 몇 가지 코드를 실행하려면

, 당신은 올바른 스레드에서 해당 코드를 실행하고 두 실행 사이의 자유로운 UI 스레드를 떠날 것 Timer (스윙 변형이 아닌 java.util 버전)을 사용합니다.

+0

대단히 감사합니다! 나는 자바 초보자이며 응답은 매우 유용했습니다. 이제 작동합니다! – sonya

관련 문제