2012-08-29 5 views
0

의 일정 금액 후 나는 단지 시간의 일정 금액 후이있는 JOptionPane의 버튼 "OK"를 표시하고 싶습니다 (의 예를 5 초 말할 수 있습니다). 당신이 나에게이 문제에 답변을 몇 가지 코드 작업을 제공 할 수있다,위한 JOptionPane : 디스플레이 버튼 "OK"시간

JOptionPane jop2 = new JOptionPane(); 
jop2.showMessageDialog(null, "Please wait 5s", "WAIT", JOptionPane.INFORMATION_MESSAGE); 

나는 전혀 그렇게하는 방법을 모른다 (내 목표는 실제로 다른 스레드 뒤에 일부 스레드 작업을 완료하도록하는 것입니다)? 미리 감사드립니다.

+0

사용자는 (버튼이 나타나기 전에) 5 초 이내에 'JOptionPane'을 계속 닫을 수 있습니다. 또한 '5 초'는 아주 자의적인 것 같습니다. 닫기 옵션은 스레드 완료에 의해 트리거되어야합니다. –

+1

_ 일부 코드 제공 :이 사이트의 작동 방식이 아닙니다. 아이디어는 _you_가 직접 코드를 제공하는 것을 돕는 것입니다 :-) – kleopatra

답변

4

JOptionPane을 사용하여이를 수행 할 구체적인 방법은 없습니다. 사용자 정의 대화 상자를 만들고 고정 된 시간 후에 확인 버튼을 표시해야합니다. Swing timer 패스 한 개를 사용할 수 있습니다.

ActionListener taskPerformer = new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     button.setVisible(true); 
    } 
}; 

Timer timer = new Timer(0, taskPerformer); 
timer.setInitialDelay(5000); 
timer.setRepeats(false); 
timer.start(); 
+0

코드의 짧은 부분을 보여 주시겠습니까? 대단히 감사합니다. – user1633807

-1

는 5 초

 try { 
      Thread.sleep(5000); // do nothing for 5000 miliseconds (5 seconds) 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
+0

5 초 후에 만이 JOption 창 버튼을 표시하고 전체 코드를 중지하지 않을 것입니다. – user1633807

+2

5 초 동안 EDT를 차단하면 실제로 사용자가 창을 처리 할 수 ​​없습니다. 아마도 대화 상자의 내용 (또는 다른 불쾌한 부작용)을 읽을 수 없게 될 수도 있습니다. 하나는 ** 절대로 EDT를 차단해서는 안됩니다. – Robin

1

당신이 찾고있는 것은 SwingWorkerProgressMonitor의 조합 인 것 소리에 대한 코드를 중지하려면이 같은 것을 사용할 수 있습니다. SwingWorker은 장기 실행 작업 (5 초 작업)을 수행하고 ProgressMonitor을 사용하여 진행 상황을 사용자에게 알립니다. 두 가지 작업을 함께 수행하는 방법을 보여주는 예제는 여기에서 찾을 수 있습니다. getting the cancel event of Java ProgressMonitor

물론 작업이 완료되면 계속 버튼을 표시하는 방법을 선택하는 것이 좋습니다. 올바른 방향으로 시작해야합니다. SwingWorker을 사용하여 Dialog에 장기 실행 백그라운드 태스크가 완료되었음을 알립니다.

import java.awt.*; 
import java.awt.Dialog.ModalityType; 
import java.awt.event.*; 
import javax.swing.*; 

public class TempProject extends Box{ 

    public TempProject(){ 
     super(BoxLayout.Y_AXIS); 

     //Contains the content of the Alert Dialog 
     Box info = Box.createVerticalBox(); 
     info.add(new Label("Please wait 5 seconds")); 
     final JButton continueButton = new JButton("Continue"); 
     info.add(continueButton); 

     //The alert to wait 5 seconds 
     final JDialog d = new JDialog(); 
     d.setTitle("WAIT"); 
     d.setModalityType(ModalityType.APPLICATION_MODAL); 
     d.setContentPane(info); 
     d.pack(); 

     //The action of the "Continue Button" 
     continueButton.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       d.dispose(); 
      } 
     }); 
     continueButton.setVisible(false); 

     //Thread That Does Work 
     final SwingWorker sw = new SwingWorker<Integer, Integer>() 
     { 
      protected Integer doInBackground() throws Exception { 
       //Do long running thread work here 
       int i = 0; 
       while (i++ < 100) { 
        System.out.println(i); 
        Thread.sleep(100); 
       } 
       return null; 
      } 

      @Override 
      protected void done(){ 
       // What to do when the long runnng thread is done 
       continueButton.setVisible(true); 
      } 


     }; 


     //Button to start the long running task 
     JButton button = new JButton("Click Me"); 
     button.addActionListener(new ActionListener(){ 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       sw.execute(); 
       d.setVisible(true); 
      }}); 
     add(button); 
    } 


    public static void main(String args[]) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setContentPane(new TempProject()); 
       frame.setPreferredSize(new Dimension(500, 400)); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 


}