2010-02-02 10 views
1

큰 응용 프로그램의 일부로, 사용자 정의 설정을 수집하고 저장하는 설정 클래스를 작성하고 있습니다. 이 클래스는 싱글 톤이며 응용 프로그램 시작 중에 인스턴스화됩니다.JFrame이 첫 번째 인스턴스화 후에 작동하지 않습니까?

사용자 입력을 받아들이려면 두 개의 다른 GUI 프레임이 ConfigSettings.java 내에서 공용 정적 메서드 인 selectSettings()로부터 차단됩니다. 둘 다 JFrame의 서브 클래스입니다. 다음은 파일 선택 대화 상자의 인스턴스화를위한 코드입니다.

private void selectFile() { 
    SelectFileGUI fileSelector = new SelectFileGUI(); 
    fileSelector.setVisible(true); 
    synchronized(this) { 
     try { 
      wait(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    fileSelector.dispose(); 
} 

응용 프로그램이 처음 실행될 때 제대로 작동합니다. 그러나 나중에 사용자는 새 소스 파일 선택을 포함하여 선택한 설정을 변경할 수 있습니다. 이것은 selectSettings()를 다시 호출하여 수행됩니다.

내가 겪고있는 문제는 이러한 GUI 구성 요소를 인스턴스화하고 다시 표시하려고하면 새로운 JFrame이 표시되지만 회색 배경이 표시되고 버튼이나 다른 구성 요소가 표시되지 않는다는 것입니다. 디버깅하는 동안 SelectFileGUI의 새 인스턴스를 직접 만들지 못했습니다.

이런 종류의 동작을 일으킬 수있는 원인은 무엇입니까?

+0

GUI 구성 요소가 정적입니까? 그렇다면 첫 번째 JFrame이 사라진 후에 사라질 수 있습니다. 글쎄, 사라진 것은 아니지만 JFrame이 없어지면 종료되었을 수 있으므로 더 이상 표시 할 수있는 상태가 아닙니다. –

답변

2

두 번째로 GUI 스레드를 사용하고 있거나 자신의 스레드 중 하나에서 호출하고 있는지 확인합니다.

그 메소드의 맨 위에서 테스트 할 수 있습니다 (AWT 스레드는 이름으로 쉽게 식별 할 수 있습니다). 개발자가 잘못된 스레드에서 호출하지 못하도록 알 수 있도록 예외를 throw합니다. 그렇지 않으면 해당 스레드를 차단할 수 있습니다. 스레드를 생성하고 작업자 스레드에서 수행하십시오.

+0

대단히 감사합니다. 당신은 완전히 옳았습니다. 스레드에주의를 기울임으로써 모든 것을 정렬했습니다. :) – deyur

0

BillK와 동의 : 처음으로 EDT 외부에서 전화 한 것처럼 들립니다 (따라서 wait()에 전화하면 EDT가 차단되지 않습니다). 그런 다음 EDT에서 두 번째로 주위를 호출합니다. SwingUtilities.invokeAndWait() 및/또는 Dialog.setModal()을 참조하십시오.

1

나는이 동작을 일으키는하지만 코드에서 단순히 가능성 (더 아래) 대화 상자를 관리 할 수있는 올바른 방법이 될 수 없습니다 다음 무엇을 알고하지 않습니다

fileSelector.setVisible(true); 
    synchronized(this) { 
     try { 
      wait(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    fileSelector.dispose(); 

당신이 당신의 대화 상자가 모달시겠습니까 안 그래? 당신이 그 (것)들을 모달하려면

는, 당신은 단순히 JColorChooser.showDialog (...) 방법 및 수익 "값"색상/파일입니다/어떤 호출 할 때와 같은 차단 호출을 확인합니다.

넌 모달이 아닌 경우 콜백을 사용하여 색상/파일을 가져옵니다. JColorChooser 대화 상자의 예제에서는 createDialog (...) 메서드를 호출하고 콜백으로 ok/cancel 리스너를 사용합니다. ,

http://java.sun.com/docs/books/tutorial/uiswing/components/colorchooser.html

다시 한번 :

난 당신이 태양의 튜토리얼을 살펴 보시기 바랍니다 예를 들어 색상 선택기에 하나 제대로 모달을 표시하는 방법을 볼 수 있습니다 (또는 비 모달) 대화 그 동기화 (이) {시도 {기다려() ...} 파일 선택기/대화 상자처럼 간단하게 뭔가를 관리하는 것은 정확하지 않을 수 있습니다.

0

AWT 페인팅 스레드 (Event Dispatch Thread)의 사용을 규율하는 규칙을 위반했다는 의견이 일치합니다.
몇 가지 참고 사항 : 코드는이 그림 스레드 외부에서 GUI 구성 요소를 칠하려고하면

  • 가, 회색 대화가 EDT 및 응용 프로그램이 페인트 사용하는 스레드 사이의 교착 상태의 결과가 될 수 .
  • 이러한 상황이 발생하면 설명한대로 새 대화 상자를 만들 수 없습니다.
  • 그러나이 문제가 발생하는 동안 디버깅 중이라고 언급 했으므로 IDE를 통해 EDT를 일시 중지 한 것일 수 있습니다.

클라이언트 응용 프로그램에서 스레드를 사용하는 방법에 대한 지침은 this tutorial을 참조하십시오.

이 문제를 완전히 이해하려면 코드 관련 부분 인 selectSettings()을 더 많이 볼 수 있습니다.

관련 문제