2014-04-13 1 views
1

SwingWorker 스레드가 실행되는 동안 내 GUI의 여러 버튼/메뉴 항목을 비활성화하려고합니다. 버튼을 클릭하면 스레드가 시작됩니다.SwingWorker의 내부 또는 외부에서 버튼을 업데이트 하시겠습니까?

내 코드의 while 루프가 CPU로드를 크게 증가시키는 것처럼 보입니다. SwingWorker 스레드가 여전히 실행 중인지 확인하는 방법에 대해 잘못된 것이 있습니까?

SwingWorker 스레드 내의 버튼/메뉴 항목을 업데이트 할 때 CPU로드가 확실히 낮습니다. 그러나 SwingWorker 스레드의 작업이 아니어야한다고 생각했습니다. 그럴까요?

JButton button = new JButton("Start"); 
button.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent evt) { 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
     menu.setEnabled(false); 

     MySwingWorker worker = new MySwingWorker(); 
     worker.execute(); 

     while (true) { 
      if (worker.isCancelled() || worker.isDone()) { 
      menu.setEnabled(true); 
      break; 
      } 
     } 
     } 
    }); 
    t.start(); 
    } 
}); 

답변

1

스윙 GUI 개체는 event dispatch thread (EDT)에 을 구성하고 조작해야합니다. t에서 변경하는 것은 올바르지 않습니다. 예문 here에 나와 있듯이 의 GIU 요소를 으로 시작하여으로 시작하고 process() 또는 done()으로 GUI를 업데이트하십시오.

+0

나는 그것을 지적 해 주셔서 감사합니다. –

+0

당신은 오신 것을 환영합니다. – trashgod

+0

또 하나의 질문 : 버튼의 ActionListener ("축하합니다, 버튼을 클릭했습니다")에서 JOptionPane을 동적으로 만들 수 있습니까? 그 일을 위해 일하는 사람은 그 목적을 위해 약간 큰 것처럼 보입니다. –

관련 문제