2012-04-21 3 views
3

정보 입력을 위해 내 응용 프로그램에서 JOptionPane을 사용하고 있습니다. JOptionPane이 표시되는 동시에 네트워크를 통해 다른 클라이언트에서 변경 한 GUI에서 변경이 발생할 수 있습니다. JTextArea의 텍스트이거나 JTree의 노드 변경 일 수 있습니다.JOptionPane이 이벤트 스레드를 차단합니까?

JOptionPane이 활성화 된 동안 변경된 사항에 문제가 없도록 새 스레드에 JOptionPane을 작성해야한다는 의미입니까?

인터넷에서 몇 군데를 보았지만 확실한 답을 얻지 못했습니다.

p.s JOptionPane은 사용자가 버튼을 클릭 할 때 생성됩니다.

+0

왜 사용해 보지 않으시겠습니까? – user1329572

+0

JOptionPane을 호출하는 스레드는 실제로 문제가되지 않습니다. UI 스레드에서 실행됩니다. – ControlAltDel

+0

'항상'a가 아닌 경우에도 시도했지만 문제가 없었습니다. 문제 .. – Giannis

답변

6

스윙은 싱글 스레드이므로 '다른 스레드 사용'옵션은 단순히 옵션이 아닙니다. 그러나 옵션 창을 표시하는 동안 구성 요소를 업데이트 할 수 없다는 의미는 아닙니다. 아래 예제를 참조하십시오. JOptionPane 호출이 차단되고 있음을 보여주기 위해 System.out 호출을 추가했지만 Swing 타이머로 인해 EDT의 JTextArea에 텍스트를 추가 할 수 있습니다.

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.Timer; 
import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class UpdateOptionPane { 

    private static void showUI(){ 
    final JFrame testFrame = new JFrame("TestFrame"); 

    final JTextArea textArea = new JTextArea(); 
    testFrame.add(new JScrollPane(textArea), BorderLayout.CENTER); 

    Timer timer = new Timer(1000, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     textArea.append("bla"); 
     } 
    }); 
    timer.setRepeats(true); 
    timer.start(); 
    JButton button = new JButton("Click me"); 
    button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     System.out.println("Before option pane"); 
     JOptionPane.showMessageDialog(testFrame, "A message dialog"); 
     System.out.println("After option pane"); 
     } 
    }); 
    testFrame.add(button, BorderLayout.SOUTH); 
    testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    testFrame.pack(); 
    testFrame.setVisible(true); 
    } 

    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     showUI(); 
     } 
    }); 
    } 
} 
+0

Timer 클래스를 소개해 주셔서 감사합니다. – Giannis

4

실제로 JoptionPane은 JDialog를 설정하고 사용하는 쉬운 방법입니다. 당신이 원하는 것은 모달이 아닌 JDialog입니다.

관련 문제