Нажатие на Button и потоки - Java

224
14 марта 2017, 13:07

Воспроизвожу звук таким образом:

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
public class Music implements Runnable {
    public Clip clip1;
    public Clip clip2;
    public Clip clip3;
    public void run(){
        while (true) {
            try {
            File soundFile = new File("MenuMusic.wav");
            AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);
            clip1 = AudioSystem.getClip();
            clip1.open(ais);
            FloatControl vc = (FloatControl) clip1.getControl(FloatControl.Type.MASTER_GAIN);
            vc.setValue(-8);
            clip1.setFramePosition(0);
            clip1.start();

            Thread.sleep(clip1.getMicrosecondLength() / 1000);
            clip1.stop();
            clip1.close();
        } catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) {
            exc.printStackTrace();
        } catch (InterruptedException exc) {
        }
    }
}
public void note_2(){
    while (true) {
        try {
            File soundFile = new File("WindowsMusic.wav");
            AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);
            clip2 = AudioSystem.getClip();
            clip2.open(ais);
            FloatControl vc = (FloatControl) clip2.getControl(FloatControl.Type.MASTER_GAIN);
            vc.setValue(-8);
            clip2.setFramePosition(0);
            clip2.start();

            Thread.sleep(clip2.getMicrosecondLength() / 1000);
            clip2.stop();
            clip2.close();
        } catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) {
            exc.printStackTrace();
        } catch (InterruptedException exc) {
        }
    }
}
public void note_3(){
    while (true) {
        try {
            File soundFile = new File("");
            AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);
            clip3 = AudioSystem.getClip();
            clip3.open(ais);
            clip3.setFramePosition(0);
            clip3.start();
            Thread.sleep(clip3.getMicrosecondLength() / 1000);
        } catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) {
            exc.printStackTrace();
        } catch (InterruptedException exc) {
        }

      }
    }
}

Класс Frame:

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
public class Music implements Runnable {
    public Clip clip1;
            public Clip clip2;
            public Clip clip3;
        public void run(){
            while (true) {
                try {
                    File soundFile = new File("MenuMusic.wav");
                    AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);
                    clip1 = AudioSystem.getClip();
                    clip1.open(ais);
                    FloatControl vc = (FloatControl) clip1.getControl(FloatControl.Type.MASTER_GAIN);
                    vc.setValue(-8);
                    clip1.setFramePosition(0);
                    clip1.start();

                    Thread.sleep(clip1.getMicrosecondLength() / 1000);
                    clip1.stop();
                    clip1.close();
                } catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) {
                    exc.printStackTrace();
                } catch (InterruptedException exc) {
                }
            }
        }
        public void note_2(){
            while (true) {
                try {
                    File soundFile = new File("WindowsMusic.wav");
                    AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);
                    clip2 = AudioSystem.getClip();
                    clip2.open(ais);
                    FloatControl vc = (FloatControl) clip2.getControl(FloatControl.Type.MASTER_GAIN);
                    vc.setValue(-8);
                    clip2.setFramePosition(0);
                    clip2.start();

                    Thread.sleep(clip2.getMicrosecondLength() / 1000);
                    clip2.stop();
                    clip2.close();
                } catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) {
                    exc.printStackTrace();
                } catch (InterruptedException exc) {
                }
            }
        }
        public void note_3(){
            while (true) {
                try {
                    File soundFile = new File("");
                    AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);
                    clip3 = AudioSystem.getClip();
                    clip3.open(ais);
                    clip3.setFramePosition(0);
                    clip3.start();
                    Thread.sleep(clip3.getMicrosecondLength() / 1000);
                } catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) {
                    exc.printStackTrace();
                } catch (InterruptedException exc) {
                }
            }
        }
    }

Это в отдельном классе. Там же у меня несколько других звуков. Так вот, нужно что бы эти звуки можно было воспроизводить при нажатии на кнопку. При первом нажатии всё срабатывает, но затем, пока не закончится воспроизведение, нажатия на другие кнопки не считываются. Скорее всего это из-за потока, но я не совсем понимаю, как это работает, кто может подсказать?

READ ALSO
Как получить значение из массива String [требует правки]

Как получить значение из массива String [требует правки]

В классе есть статический массив типа String:

227
Как сделать компилятор для андроида

Как сделать компилятор для андроида

Как сделать компилятор для андроида например компилятор по c++ или другие языки программирования без разницыИ что для этого нужно знать?

242
Какая разница в алгоритмах работы GC, Copying и Compaction?

Какая разница в алгоритмах работы GC, Copying и Compaction?

Понятно что оба алгоритма, призваны "сжать" используемые ячейки памяти так, что-бы они шли подряд

161
Прикладная задача на java 8 stream API

Прикладная задача на java 8 stream API

Есть три класса: A, B и CКласс C содержит поле List<B>, класс B содержит поле List<A>

219