2010-07-27 8 views
1

텍스트 영역과 버튼 등이있는 GUI가 있습니다 .........Java GUI 및 스레드

나는 지속적으로 실행되는 스레드 인 다른 클래스가 있습니다. 스레드 클래스에서 특정 조건이 충족 될 때 텍스트 영역에 텍스트를 추가하고 싶습니다.

텍스트 영역이 포함 된 클래스에는 텍스트 영역에 대한 getter 메서드가 있습니다. 또한 클래스 (텍스트 영역 포함)를 스레드 클래스의 변수로 선언했습니다.

변수에 대한 textarea의 get 메소드를 호출 한 후 append() 메소드를 호출하려고 시도하지만 textarea가 자체적으로 업데이트하지 않습니다.

무엇이 잘못 되었나요?

귀하의 도움에 감사드립니다.

+0

제목과 관련된 내용으로 변경하십시오. 그렇게하면 업체 정보를 보는 사람들이 궁금한 점을 알게됩니다. – helios

+0

"append"메서드는 스레드로부터 안전합니다. 따라서 GUI에 텍스트가 표시되지 않으면 보이는 텍스트 영역에 대한 적절한 참조가없는 것입니다. 실수로 두 개의 텍스트 영역을 만들었을 수도 있습니다. 보이는 텍스트 영역에 텍스트를 추가하는지 확인할 수 있도록 System.out.println (textArea.getText())을 추가하십시오. – camickr

답변

5

요점은 Swing을 사용하여 스레드 관리에 따라 Sun에서 제공 한 지침에 따라 관리해야한다는 것입니다. here을 볼 수 있습니다.

사용자가 이해할 수있는 점은 구체적인 경우에 따라 SwingUtilities.invokeLater(..)SwingUtilities.invokeAndWait(..)과 관련된 GUI 관련 이벤트를 보내야한다는 것입니다. 이는 GUI 이벤트가 이벤트 디스패치 스레드에 의해 관리되고 사용자 스레드에서 관리하지 않아야하기 때문에입니다.

+0

일부 Swing 문서 (JDK 7 ... 이하)는 특정 메서드가 스레드로부터 안전하다는 것을 나타냅니다. 이러한 의견은 구현 또는 가능한 모든 구현에 동의하지 않는 경우가 많습니다. 또한 스레드 방식으로 이러한 메서드를 사용하려고 시도하는 코드는 자체 스레드 버그가있을 수 있습니다. –

1

UI가 아닌 스레드에서 UI 메서드를 호출하면 안됩니다. UI가 아닌 스레드에서 메서드를 호출하려면 "UI 스레드에 코드를 보내 실행을 요청합니다"라는 UI 전용 메서드가 있어야합니다. SWT에서 이것은 Display.getDefault().asyncExec(Runnable)입니다. 스윙의 경우 SwingUtilities.invokeLater()을 사용하십시오.

자세한 내용은 this article을 참조하십시오.