2016-07-21 2 views
1

스윙 앱에 문제가 있습니다.최소화 된 경우 스윙 앱이 다운 됨

나는 내부에 for 루프가 있으며 300+ oracle 데이터베이스 요청을 시작하고 결과로 여러 개의 JTable을 채 웁니다. SwingWorker이 있습니다.

스윙 앱 창을 최소화하지 않거나 Windows 탐색기에 부분적으로 표시되는 경우 일괄 처리가 정상적으로 완료됩니다. 이제 앱을 최소화 한 다음 스윙 앱으로 돌아 가면 얼어 붙습니다.

기본 윤곽선과 구성 요소의 색상이 표시됩니다. 대부분의 창은 배경색 (검은 색)으로 설정되며 텍스트는 표시되지 않습니다. 응용 프로그램을 죽일 수있는 유일한 방법은 프로세스를 죽이는 것입니다. 'X'버튼을 클릭해도 윈도우가 닫히지 않습니다.

이것은 일반적인 문제입니까? 어떻게 그것을 막을 수 있습니까? 배치 노동자 내부

루프 :

for(int i=1; i<=maxDepth; i++){ 
    String[] result = getAllLists(database, i); 
    for(int j=0; j<result.length; j++){ 
     String period=result[j]; 
     for(String name : names){ 
      System.out.println("New Query: "+name+ " " + period + " | " + "Loading " + (days) + " days x " + years + " years --- "); 
      if(isValid(period,name)){ 
       List<TickHistory> queryResult = model.getByDaysMultiple(name,period,days+mod+daysHeadroom,years, false); 
       getModelTableData(name, period, DatabaseHelpers.dateToString(lastCob), years,days,queryResult); 
       populatePricesTable(queryResult, days, false); 
       view.setNameText(name); 
       view.setPeriodText(period); 
      }else{ 
       System.out.println("query invalid"); 
      } 
     } 
    } 
} 
+1

몇 가지 코드를 알려주십시오. 아마도 SwingUtilities.invokeLater()가 없습니다. jvisualvm으로 앱을 확인하는 것도 도움이 될 수 있습니다. –

+1

예외가 있습니까? 'publish'와'process'를 올바르게 사용하고 있습니까? –

+0

@TamasRev 메인 프레임, 컨트롤러 및 데이터베이스에 연결하는 데 사용하는 개체를 만드는 주 프로세스에서 invokelater를 사용합니다. – LucasSeveryn

답변

3

난 아무데도 내 코드에 publishprocess를 사용하지 마십시오.

이것은 아마도 문제의 원인 일 수 있습니다. SwingWorkerpublish()doInBackground()으로, 을 사용하여 이벤트 발송 스레드의 TableModel을 업데이트합니다. 완전한 예제는 here입니다.

image

+0

배치 작업자 내부에서 질문에 루프를 추가했습니다. db로부터 데이터를 가져 오는'getByDaysMultiple' 메소드를 볼 수 있습니다. 그리고 나서 또 다른 요청을 발생시키는'getModelTableData'와 JTable을 채우는'populatePricesTable'과 아래의 몇몇 뷰 메소드를 볼 수 있습니다. 그것은 내 첫 번째 스윙 애플 리케이션이므로 귀하의 설명을 주셔서 감사합니다. – LucasSeveryn

+0

'doInBackground()'에서'TableModel'을 업데이트하면 안됩니다. [Turorial Cited] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/interim.html)에 표시된대로 중간 결과를 '게시'(publish())하기 위해 코드를 다시 작성해야합니다. 문제가있는 경우 접근 방법을 보여주는 [example cited] (http://stackoverflow.com/a/34742409/230513)를 기반으로 [mcve]를 포함하도록 질문을 편집하십시오. – trashgod