Потоки и JOptionPane против немодального JDialog

Я написал метод, который воспроизводит аудиоклип, пока отображается JOptionPane.

private synchronized void playSound(final String path_) {
      new Thread(new Runnable() {
        public void run() {
            try {
                Clip clip = AudioSystem.getClip();
                BufferedInputStream bufferedIn=new BufferedInputStream(this.getClass().getClassLoader().getResourceAsStream(resourcesPath+path_));
                AudioInputStream inputStream = AudioSystem.getAudioInputStream(bufferedIn);
                clip.open(inputStream);
                clip.loop(Clip.LOOP_CONTINUOUSLY);
                while (runThread) {
                    Thread.sleep(5000);
                }
                clip.stop();
            }
            catch (Exception e) {
                System.err.println("Audio clip ("+resourcesPath+path_+") error: "+e.getMessage());
                e.printStackTrace();
            }
        }
      }).start();

Я вызываю этот метод непосредственно перед вызовом метода JOPtionPane.

public void timerAlert(String text_) {
    runThread=true;
    playSound(sounds.get("Alarm"));
    JOptionPane.showMessageDialog(GUI.getInstance().getFrame(),text_);
    runThread=false;
}

Это работает просто отлично. Тем не менее, я также хочу сделать то же самое, когда я отображаю немодальный JDialog. Я делаю то же самое, но клип не будет воспроизводиться.

public void alert(TimelineRecord timeline_) {
    runThread=true;
    playSound(sounds.get("Alarm"));
    new AlertDialog(timeline_.eventText,timeline_);
    runThread=false;
}

Я предполагаю, что немодальный JDialog не является на самом деле неблокирующим, поскольку я интерпретирую документацию. По крайней мере, похоже, что JDialog блокирует звуковую нить. В чем разница между JOptionPane и немодальным JDialog в том, что касается блокировки других потоков? ТИА.

0 ответов

Другие вопросы по тегам