2010-02-26 7 views
1

jTable과 jButton이 있습니다. 클릭하면 버튼의 actionPerformed 메서드는 while 루프가 포함 된 다른 메서드를 호출하고 루프를 통해 테이블 ​​모델 (DefaultTableModel)에 행을 추가합니다. while 루프는 몇 분 동안 실행될 수 있으므로 매번 테이블에 추가되는 행을 GUI에 표시하려고합니다. 그러나 지금은 루프가 완료된 후 테이블에 모든 행을 함께 추가하므로 몇 분 동안 행 수가 하나씩 증가하는 대신 0 행이 포함 된 테이블을 표시하는 데 몇 분이 소요됩니다. 그리고 즉시 수천을 가졌습니다. 나는 updateUI를 호출하고, 테이블에서 다시 칠하고, 모델에서 fireTabledDataChanged를 호출하는 등의 시도를했지만, 아무런 차이가 없다. 나는 또한 스윙 타이머를 사용해 보았지만 아무 소용이 없었다. 덕분에 도움이나 조언을 주시면 감사하겠습니다.루프를 통과하는 jTable에 행을 추가 하시겠습니까?

답변

3

를 통해 EDT에 떨어졌다 가져옵니다 Runnable에서 수행 할 수 튜토리얼 Concurrency EDT가 작동하는 방법에 대해 자세히 설명합니다. 자신 만의 Thread를 만들고 SwingUtilties.invokeLater()를 사용하는 것 외에도 SwingWorker를 사용하는 새로운 접근 방법을 사용할 수도 있습니다. 이 자습서에는 예제가 들어 있습니다. 나는에 updateUI를 호출하려고했습니다

,

그런 일을하지 마십시오. 문제가 해결 되더라도 잘못된 해결책입니다. UI를 업데이트하지 않고 구성 요소를 업데이트하고 있습니다.

1

DefaultTableModel을 사용하는 경우 각 반복 중에 모델에 addRow을 호출하면 모델이 업데이트되어 JTable을 업데이트해야합니다. 테이블은 그것이 다시 칠해 지도록 요청할 것이고 그 요청은 EDT로 갈 것입니다. 불행하게도, 장기간에 걸친 프로세스는 EDT에서 처리되는 다른 요청을 보류하고 있습니다. 당신이 할 수있는 최선의 것은 당신의 버튼을 작업자 스레드에서 프로세스를 실행해야하고, 해당 스레드는 그 addRow 호출이 스윙에서 섹션을 읽어 SwingUtilities.invokeLater

+1

내 대답은 내가 네가 게시 한 것을 본 것과 거의 똑같을 것이라고 생각했다. :) –

관련 문제