Этот код выглядит так, как будто он не должен ничего делать, и, в частности, не должен останавливать воспроизведение звука:
stopSound.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
AudioPlayer player = new AudioPlayer();
player.stop();
}
});
Причина в том, что вы создаете новый AudioPlayer внутри этого слушателя, который, кажется, совершенно не связан с любым другим объектом AudioPlayer, включая объект AudioPlayer, который в данный момент воспроизводит ваш сигнал тревоги.
Вот ваш текущий проигрыватель AudioPlayer:
public void waitForAlarm() {
waiter = new Thread(new Runnable() {
public void run() {
while (Thread.currentThread() == waiter) {
Calendar d = Calendar.getInstance();
if (getAlarmHours() == d.get(Calendar.HOUR_OF_DAY)) {
if (getAlarmMinutes() == d.get(Calendar.MINUTE)) {
UserInterface.setAlarmText("No Alarms");
try {
// **** here ****
AudioPlayer playSound = new AudioPlayer(
UserInterface.getSoundFile());
//..
} catch .... etc..
}
}
}
}
});
waiter.start();
Было бы гораздо разумнее вызывать stop для текущего воспроизводимого объекта AudioPlayer, а не для фиктивного объекта AudioPlayer, созданного в слушателе. Чтобы получить ссылку на воспроизводимый в данный момент объект AudioPlayer, вам необходимо объявить его как поле класса, а не в методе и блоке try. Затем, если вы хотите остановить его, убедитесь, что он не равен нулю, и если все в порядке, вызовите остановку на нем.