2014-12-28 2 views
0

내 단추 'licz'를 사용하여 정보의 텍스트 값을 '로딩'으로 변경하고, 작업을 수행하고 '정보'를 '완료'로 변경하십시오.JButton 작업 중에 JLabel 텍스트를 어떻게 바꿀 수 있습니까?

 licz.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      info.setText("Loading..."); // Here 
      if(go()) 
      { 
       brute(0); 
       info.setText("Done!"); //here 
       if(odwrot) 
        JOptionPane.showMessageDialog(frame, "good"); 
       else 
        JOptionPane.showMessageDialog(frame, "bad"); 
      } 
      else 
      { 
       JOptionPane.showMessageDialog(frame, "bad"); 
       info.setText("Done"); // And here 
      } 

     } 
    }); 

('licz'는하는 JButton은 '정보'의 JLabel, 여기에)하지만 프로그램은 먼저 "무엇인가", 변경 '정보'라벨이 어떻게 유지하는 "로드"즉시에 "완료"로한다 혹시?

+1

는'무엇을 이동하는()'와'짐승 (0);'? 긴 프로세스에서 실행하는 것과 같이 많은 시간이 필요합니까? – Mshnik

+0

이러한 버튼, 액션 리스너 등은 같은 클래스에 있습니다. 프로그램은 때로는 약 10 초 동안 움직일 수 있으며 "Loading"텍스트가 없을 때 충돌 한 것처럼 보입니다 – Ikciwor

+0

아하 :). 어떤 라인이 걸릴까요? 아마도'go()'(부울을 반환) 또는'brute (0)'일 것입니다. – Mshnik

답변

0

actionPerformed 이벤트는 이벤트 처리 스레드에서 처리되며 반응이 빠른 GUI를 사용하려면 빨리 종료해야합니다. 따라서 invokeLater으로 전화하십시오. 자바 8

licz.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     info.setText("Loading..."); 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       boolean good = false; 
       if (go()) 
       { 
        brute(0); 
        good = odwrot; 
       } 
       JOptionPane.showMessageDialog(frame, good ? "good" : "bad"); 
       info.setText("Done"); 
      } 
     }); 
    } 
}); 

또는 :

licz.addActionListener((e) -> { 
    info.setText("Loading..."); 
    EventQueue.invokeLater(() -> { 
     boolean good = false; 
     if (go()) 
     { 
      brute(0); 
      good = odwrot; 
     } 
     JOptionPane.showMessageDialog(frame, good ? "good" : "bad"); 
     info.setText("Done"); 
    }); 
}); 
+1

에서 이것을 호출하지 말아야한다. 그는 실제로 태스크를 처리하기 위해'SwingWorker'를 사용해야한다. 상표. 또한 이것이 올바른 정보 임에도 불구하고 질문에 대답하는 방법에 대해서는 아직 확실하지 않습니다. (질문은 무엇인지 알아 내려고 노력하고 있습니다.) –

+0

@VinceEmigh yes [SwingWorker] (http://docs.oracle .com/javase/tutorial/uiswing/concurrency/worker.html)은 실제로 백그라운드에서 작업하는 것을 목적으로합니다. 반면 5 초 미만의 일반적인 작업의 경우 추가 API 레이어를 사용하여 첫 번째 답변을 시작하지는 않습니다. 어쩌면 원하는가? –

+0

다시 한번 살펴보면 EDT에서'brute'가 여전히 호출 중입니다. 당신이하고있는 일은 자신이하고있는 것과 비슷합니다. 큐를 끝까지 게시 할 때까지 기다리는 시간이 그다지 짧지 않을 수도 있습니다. 예, 추가 API 레이어가 있지만 작업이 올바르게 완료되면 중요한 작업입니다. 항상 Executors.singleThreadExecutor를 사용하여 레이어를 피하도록 동기화 할 수는 있지만 아무도 그렇게하지 않으려 고합니다. 나는 전화로 코드를 작성하는 팬이 아니라, 나중에 아무 것도 기본 선택으로 언급하지 않으면 대답을 만들게됩니다. –

관련 문제