Как задержать MessageDialogBox в Java? - PullRequest
3 голосов
/ 29 июля 2011

Итак, в этом фрагменте кода:

//Actions performed when an event occurs.
    public void actionPerformed(ActionEvent event) 
    {
        String command = event.getActionCommand();

        //If btnConvertDocuments is clicked, the FileConverter method is called and the button is then disabled [so as to prevent duplicates].
        if (command.equals("w"))
        {
            new Thread(new Runnable() 
            {
                public void run() 
                {
                    FileConverter fc = new FileConverter();

                }
             }).start();
            btnConvertDocuments.setEnabled(false);
            //Validation message ensuring completion of the step.
            JOptionPane.showMessageDialog(this, "Step 1 Complete!", "Validation", JOptionPane.INFORMATION_MESSAGE);
        }

Кажется, что диалоговое окно сообщения всплывает слишком быстро, прежде чем метод FileConverter даже не будет вызван. Мне было интересно, было ли правильное размещение JOptionPane, или был способ задержать сообщение, пока метод не закончил обработку?

Ответы [ 2 ]

5 голосов
/ 29 июля 2011

Вы можете использовать SwingWorker .

Посмотрите здесь, Java-учебник .

SwingWorker worker = new SwingWorker<Void, Void>() {
    @Override
    public Void doInBackground() {
        FileConverter fc = new FileConverter();
        return null;
    }

    @Override
    public void done() {
        JOptionPane.showMessageDialog(this, "Step 1 Complete!", "Validation", JOptionPane.INFORMATION_MESSAGE);
    }
};
3 голосов
/ 29 июля 2011

Вы должны использовать Swing Timer с задержкой, вместо того, чтобы использовать для этого собственный поток и Runnable.

Вы можете использовать таймеры Swing двумя способами:

  • Выполнить задание один раз, после задержки. Например, диспетчер всплывающих подсказок использует таймеры Swing, чтобы определить, когда показывать всплывающую подсказку, а когда скрывать ее.
  • Для выполнения задачи повторно. Например, вы можете выполнить анимацию или обновить компонент, который отображает прогресс в достижении цели.

Пример из документации:

  int delay = 1000; //milliseconds
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          //...Perform a task...
      }
  };
  Timer myTimer = new Timer(delay, taskPerformer);
  myTimer.setRepeats(false);
  myTimer.start();
...