2012-09-29 3 views
1

그래서이 문제가 있습니다. 파일을 만들고로드하는 프로그램이 있습니다.청취자 및 유효성 검사/다시 칠하기

내 프로그램에 파일을로드 할 때 특정 구성 요소가 "가득 찼습니다"라는 메시지가 표시되는 구성 요소 수신기를 사용하고 그에 따라 모든 구성 요소를 이동합니다.

상단에 각 구성 요소를 추가 한 다음 부모 구성 요소가 채워지는 경우 청취자 등록을 수행하고 하단 구성 요소를 생성 한 새 부모로 이동합니다. 그것을 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는 결코 일어나지 않았습니다.

+2

GUI의 이벤트 스레드에서 오랫동안 실행되는 것처럼 냄새를 풍깁니다 (또는 더 나쁜 경우 이벤트 스레드에서 'Thread.sleep (...)'호출). 이것은 GUI를 잠자기 상태로 만드는 것입니다. 이것이 Swing GUI이므로 SwingWorker를 사용하여 배경 작업을 수행하고 있습니까? 그렇지 않은 경우이 작업을 수행 할 것을 적극 권장합니다. 당신이 당신의 EDT에 자고 싶었어 같은 HFOE 주석에 –

+2

+1 확실히 소리가 난다. 당신은 (a는 [SSCCE] (http://sscce.org) –

+0

응답에 대한 편집을 확인 ... – Karlovsky120

답변

2
  • 내가 컨테이너에 어떤 문제 with add/remove/modify JComponents을 볼 수 있습니다 - 당신이 필요로하는 경우 컨테이너 (JPanel는 EI) JScrollPane

  • 에 배치되는 경우

  • 의존 (JFrame>JPanel EI)을 따라 용기 내에 add/remov E/S modifyJComponentpack() 전화 다음에 제 (예를 들어) JFram (E)의 크기를 변경하는 e 화면

+0

데모 용 +1 좋은 링크 :) –

+1

@David Kroukamp 이것들은 내가 끝없는 게으름에 노예가되지 않는 순간이다 – mKorbel

+0

사실 컨테이너는 JScroolPane에있다. (JFrame에는 JPanel 컨테이너가 설정된 JScrollPane이있다. 뷰포트로). 그렇게 나쁘고 어떻게 해결할 수 있습니까? 그 높이가 0에 도달 할 때 내가 팩()를 호출 할 필요가 없으며, JFrame의이 과정에서 크기가 조정되지 않는, 모든 성분은 구성 요소가 추가 될 때 감소 필러를 제외하고 (있다, 리스너는 triggerd는 없다 - 어떻게 오버플로를 감지하고 있습니다.) – Karlovsky120