그래서이 문제가 있습니다. 파일을 만들고로드하는 프로그램이 있습니다.청취자 및 유효성 검사/다시 칠하기
내 프로그램에 파일을로드 할 때 특정 구성 요소가 "가득 찼습니다"라는 메시지가 표시되는 구성 요소 수신기를 사용하고 그에 따라 모든 구성 요소를 이동합니다.
상단에 각 구성 요소를 추가 한 다음 부모 구성 요소가 채워지는 경우 청취자 등록을 수행하고 하단 구성 요소를 생성 한 새 부모로 이동합니다. 그것을 houndred 페이지 MSWord 문서의 시작 부분에 새로운 텍스트 줄을 추가한다고 생각하십시오.
청취자는 메모리에있는 모든 것이 화면에 그려지지 않으면 잘못된 구성 요소의 높이 (일반적으로 0 임)를 잡아서 계산에 사용하여 잘못 나온 다음 모든 것이 엉망이됩니다. 쪽으로. ,
(everytning가 JFrame의 한 인 JPanel에서 발생)이 이유는/검증 칠 그 addComponent 방법이다있다
trigger opening method:
{
repeat this x (lets say e.g. 100) times:
{
trigger addComponent method
{
add component
{
adding component triggers the component listner 8if there is no more room in parent)
{
move all of the components one place down, move the ones out of bounds to next "page"
repaint and revalidate whole JFrame (inside listener)
}
}
repaint and revalidate whole JFrame (part of addComponent method)
}
repaint and revalidate whole JFrame(part of opening methid, after component addition)
}
repaint and revalidate whole JFrame (as a part of opening method, final repaint/validate)
}
:
여기 내 프로그램의 일부의 흐름도 청취자뿐만 아니라 청취자는 다른 기능을 가지고 있으며 그 곳이 재 칠/검증을위한 유일한 장소입니다.
문제점은 opeoning 메소드의 마지막 (최종) 유효성 검사/다시 페인트 호출까지 JFrame이 다시 채워지지 않는다는 것입니다. 나는 이것을 증명하기 위해 (validate/repaint 후) 코드의 여러 위치에 Thread.sleep (1000)을 추가하려고 시도했다.
또한 내가 아는 한 컴포넌트 리스너가 트리거되면 트리거 된 행에서 멈추고 자체 실행되고 그 라인에서 계속 진행됩니다.
어떻게 수정합니까? 청취자가 자신의 직무를 수행 한 후에 각각의 새로운 구성 요소가 추가 된 후 내 프로그램이 다시 칠/검증되도록하려면 어떻게해야합니까? 처음 두 의견에
답장 : 첫째, (1000)에 Thread.sleep 문제를 진단하는 데 불과했다. Thread.sleep를은 (1000) 방법은 다시 그리기/validate 메소드, 그래서 내가 reapint()가 호출 된 직후 프로그램을 일시 중지하면 나는 모든 일시 정지 한 후, GUI가되지 않은, 내가 새로운 요소가 추가 된 볼 것입니다 광고를 다시 칠 것, 생각 직전 경우.
둘째, 긴 계산에 대해 계산이 그 길이없는 (그러나, 순간적인 결과를 얻는다 (20 개)이 구성 요소를 실행하지 않고 요구되는 것들). 또한, 계산을 위해서는 GUI에 컴포넌트를 제거하고 추가하는 작업 (10-20 라인마다)이 필요합니다. 따라서 SwingWorker를 통합하는 것은 거의 불가능하며 필요하지 않습니다.
셋째, 전체 내용을 놓친 것 같습니다. 실행의 길이는 여기에서 진짜 문제가 아니며, GUI의 정지도 아닙니다 (실제로 발생하지는 않습니다 만, 눈에 띄지 않을 정도로 길지 않습니다). 문제는 repaint/validate가 모든 구성 요소에 대해 총 3-4 회 반복됩니다 (20 개 구성 요소로 파일을 열면 60-80 번). 실행되는 것을 본 유일한 시간은 가 호출 된 마지막 시간, 루프 후 ...
난 다시 그리기/검증 한 후에서 System.out.println ("뭔가") 직전 방법과 오른쪽을 넣어. 그것은 "무언가"두 번 인쇄했지만 repaint/validate는 결코 일어나지 않았습니다.
GUI의 이벤트 스레드에서 오랫동안 실행되는 것처럼 냄새를 풍깁니다 (또는 더 나쁜 경우 이벤트 스레드에서 'Thread.sleep (...)'호출). 이것은 GUI를 잠자기 상태로 만드는 것입니다. 이것이 Swing GUI이므로 SwingWorker를 사용하여 배경 작업을 수행하고 있습니까? 그렇지 않은 경우이 작업을 수행 할 것을 적극 권장합니다. 당신이 당신의 EDT에 자고 싶었어 같은 HFOE 주석에 –
+1 확실히 소리가 난다. 당신은 (a는 [SSCCE] (http://sscce.org) –
응답에 대한 편집을 확인 ... – Karlovsky120