2009-10-23 2 views
0

나는 자바 GUI 프로그램을 만든 및jList의 항목을 java에 표시하는 방법은 무엇입니까?

listBox.addElement(""); // where listBox is an instance of jList 

를 호출하여 항목을 추가하여 해당 JList의에 프로그램의 출력을 인쇄 그러나 문제는 항목이없는 것입니다 수 있도록하는 GUI에하는 JList를 추가 한 추가시 표시됩니다. 프로그램이 끝날 때 표시됩니다.

"시작"버튼을 클릭하여 프로그램을 시작한 후 "listBox"에 항목을 추가하는 등 전체 처리가 완료되지만 프로그램이 다시 시작될 때 jList에 항목이 표시됩니다. "시작"버튼의 ActionListener에 대한 "actionPerformed()"메소드.

항목을 목록에 추가 할 때 즉시 표시하도록 수행 할 수있는 작업.

위의 응용 프로그램은 멀티 스레드입니다. 메인 스레드는 GUI를 시작한 다음 10 개의 스레드를 시작하고 각 스레드가 "addElement (" ")"메소드를 호출하여 목록에 항목을 추가 할 수 있도록 jList의 "listModel"(DefaultListModel 인스턴스)을 모든 스레드에 전달합니다. "listModel"

실제로, listModel은 DefaultListModel 클래스의 서브 클래스 (DefaultListModelSubClass)의 인스턴스입니다. addElement() 메서드를 재정 의하여 한 번에 하나의 스레드 만 항목을 추가 할 수 있도록 "동기화"되도록했습니다.

답변

3

아마도 GUI 업데이트를 처리하는 스레드 인 Event Dispatching Thread에서 처리하려고 할 것입니다. 처리는 GUI가 갱신되지 않도록 잠그고 처리가 끝나면 적절한 GUI 변경 사항이 전파됩니다. 이 기능을 사용하려면 별도의 스레드에서 처리를 수행하고 필요에 따라 EVT과 통신해야합니다. Java 6을 사용할 수 있다면 SwingWorker이 최선의 방법입니다.

+0

J2SE 5.0 명중 수명의 끝에서 업데이트하려면 "그림"스레드에게 일주일. 새로운 코드가 없기를 바란다. –

+0

1.4를 실행하는 레거시 Java 응용 프로그램을 작성했습니다. 나는 그것이 빤다는 것을 안다. 그러나 그것이 단지 그것이있는 방법이다. –

1

모든 이벤트의 다시 그리기 및 처리는 AWT 이벤트 발송 스레드 (EDT)에서 수행됩니다. 그런 경우가 아니라면 멀티 스레딩을 처리 할 수 ​​있습니다. GUI에서는 그다지 실용적이지 않습니다.

해결책은 다른 스레드에서 차단 처리를 실행하는 것입니다. java.awt.EventQueue.invokeLater으로 EDT에서 코드를 실행하여 GUI를 업데이트하십시오. 멀티 스레드이므로 매우 조심해야합니다. 특히 일반적인 충고는 잠글 필요가 없도록 스레드간에 전달되는 객체에 대한 불변성을 선호하는 것입니다. 또한 많은 작은 자물쇠에 우선하여 넓은 자물쇠는 거의 사용하지 않지만 콜백에는주의해야합니다.

SwingWorker을 피하십시오. 데모를 짧게 만듭니다. 그러나 프로덕션 코드의 경우 GUI 및 비 GUI가 밀접하게 결합 된 설계를 강제 실행합니다.

+0

예, 응용 프로그램이 멀티 스레드입니다. 나는 내 질문을 업데이트했다. 친절히 살펴 봅시다. –

1

이 목록의 충전이 끝날 때 간접적으로 당신이 페인트 메소드를 호출하는

 
click 
    | 
    -----> ActionPerformed 
       | 
       ----------------> Fill the list 
             | for each item 
             --------------------> jlist.addElement() 
       | 
       ----------------> paint the jlist 

일어나는 것입니다.

그 전에 결과를 얻으려면 요소를 추가 할 때 목록을 페인트해야합니다.

Stefan Kendall로 SwingWorker를 사용하면이 작업을 수행 할 수 있습니다.일반적인 용어로

당신이 동시에 "입력"목록은 다른 스레드를 사용 할 수있는 시간이 지남에 따라 GUI를

 
click 
    | 
    -----> ActionPerformed 
       | 
       ----------------> Fill the list 
             | for each item 
             --------------------> jlist.addElement() 
              | 
              | (in other thread) 
              ----> paint the list (with the element so far) 

       | 
       ----------------> paint the jlist