2009-10-15 4 views
2

나는 다음과 같은 접근 방식의 차이에 관해서는 스윙 창 만드는 궁금 : 주에서 java.awt.EventQueue.invokeLater을()()를 사용하여스윙 창을 초기화 할 수있는 방법의 차이점은 무엇입니까?

  1. 을;
  2. main()에서 SwingUtilities.invokeLater()를 사용합니다.
  3. 스레드로 전혀 신경 쓰지 않고 JFrame 서브 클래스를 인스턴스화하고 main에서 setVisible (true)을 호출하여 Runnable 내에 래핑하지 않고 호출합니다. 이것은 어쨌든 작동하는 것 같습니다.

감사합니다.

답변

3

스레딩에서 염두에 두어야 할 점은 "모든 상황에서 명백하게 작동합니다"와 "작동하는 것"이 ​​같지 않다는 것입니다.

기본 규칙은 이벤트 스레드 외부에서 구성 요소를 스윙/조작하면 안되며 응용 프로그램의 기본 스레드는 "이벤트 스레드 외부"입니다. 따라서 응용 프로그램 시작 코드에서 이어야 invokeLater()에 기본 창을 만들어야합니다.

Swing으로 프로그래밍하는 경우 SwingUtilities 버전의 invokeLater()를 사용합니다. 비록 내가 현재의 구현에서 기능적으로 생각하는 것만으로도 다른 것을 호출한다고해도, 미래에는 이것이 바뀔 수 있다고 생각합니다.

3

SwingUtilities.invokeLater은 단지 EventQueue.invokeLater입니다. 후자는 Java 1.2에서 소개되었습니다. 그 전에 스윙은 EDT에 도착하기 위해 창을 다시 칠한 해킹을했습니다. 나는 java.awt.EventQueue이이 방법에 대한 논리적 인 장소이고, 합당한 사람이 전화 할 것을 제안합니다. 그러나 Swing과 AWT의 관계는 심각하게 엉망입니다.

JFrame을 서브 클래스로 만들 필요가 거의 없으며 일반적으로 나쁜 습관입니다. 하지만 나쁜 습관은 스윙의 표준입니다. 멀티 스레드 방식으로 실행하면 잠재적으로 문제가 발생할 수 있습니다. 단, 자신의 컴퓨터에서 문제가 발생할 수도 있습니다. 당신이 할 수있는 최악의 일은 EDT에서의 약간의 초기화와 주 스레드에서 약간의 비트 (잠시 동안 (모든 프로그램 중 FindBugs가 단일 하드웨어 스레드 머신에서 시작할지 여부는 50/50)였습니다.

+0

"JFrame을 하위 클래스로 만들 필요가 거의 없으며 일반적으로 나쁜 습관입니다." - 이젠 내가 관심있어. NetBeans는 앱 골격을 만들 때 자동으로이 작업을 수행했습니다. 왜 이것이 나쁜 것인가에 대해 자세히 설명해 주시겠습니까? – neuviemeporte

+1

JFrame을 서브 클래 싱하는 것과 관련하여 문제가 보이지 않습니다. 논리적으로 필요한 것이 JFrame의 하위 클래스 인 경우 JFrame의 하위 클래스를 만듭니다 ... –

+0

매우 드물게 JFrame의 * 하위 클래스 *가 필요합니다. 당신처럼'Thread'의 하위 클래스가 거의 필요하지 않습니다. –