Почему мое воспроизведение звука замораживает ActionListners?

#java #audio #java-8

#java #Аудио #java-8

Вопрос:

Я использую этот javaPlayer для воспроизведения моих звуков.

Но в моем более крупном проекте он замораживает / игнорирует почти все входные JFrame.EXIT_ON_CLOSE и ActionListner данные, которые изменяют содержимое фрейма. Я попытался устранить проблему в этом фрагменте.

btn.addActionListener(e -> System.out.println("Check1")); Не применяется к моей кнопке. Только если я закомментирую все try/catch-block "Check1" , также достигается. В чем может быть проблема? Я уже пытался отправить playerpart с помощью Swing.invokeLater в другой поток.

 package mainMVC;

import java.io.FileInputStream;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class Alone {
    public static void main(String[] args) {
        
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        
        JButton btn = new JButton("Test");
        btn.addActionListener(e -> System.out.println("Check"));
        
        frame.add(btn);
        frame.pack();
        
        try (FileInputStream fis = new FileInputStream("src/EgyptianTavernFullofGuitarists_1.mp3"))
        {
            Player player = new Player(fis);
            player.play();
        } catch (IOException | JavaLayerException e) {
            e.printStackTrace();
        }
        btn.addActionListener(e -> System.out.println("Check1"));
        
    }
}
  

Ответ №1:

Я не знаю, в чем проблема. Я протестировал ваш код в своей IDE, и он работает. Во время начального кадра воспроизводится музыка. ActionListener возвращается Check , и музыка не останавливается, то же самое EXIT_ON_CLOSE .

Комментарии:

1. есть второй btn.addActionListener(e -> System.out.println(«Check1»));

2. дело в том, что кнопка btn должна возвращать значение Check вместо Check1 ?

3. просто закомментируйте весь блок try / catch, и он напечатает оба, потому что я добавляю два разных actionlisteners

4. хорошо, это верно, и почему вам нужны два ActionListener на одной кнопке. Я думаю, что это нормальное явление. Скажите мне точно, что здесь не так, потому что я не понимаю.

5. пожалуйста, внимательно прочитайте мой вопрос и ответьте, что второй ActionListener предназначен только для тестирования

Ответ №2:

РЕДАКТИРОВАТЬ: я обнаружил, что выполнение остановлено до завершения воспроизведения файла.

Я справился с этим с помощью ручного создания потока. Теперь печатаются как «Check», так и «Check1».

File: Audio.java

 package mainMVC;

import java.io.FileInputStream;
import java.io.IOException;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

class Audio extends Thread {
    public void run(){
        try (FileInputStream fis = new FileInputStream("src/EgyptianTavernFullofGuitarists_1.mp3"))
        {
            Player player = new Player(fis);
            player.play();
        } catch (IOException | JavaLayerException e) {
            e.printStackTrace();
        }
    }
}
  

File: Alone.java

 package mainMVC;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Alone {
    public static void main(String[] args) {
        
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        
        JButton btn = new JButton("Test");
        btn.addActionListener(e -> System.out.println("Check"));
        
        frame.add(btn);
        frame.pack();

        Audio myThread = new Audio();
        myThread.start();
        
        btn.addActionListener(e -> System.out.println("Check1"));
        
    }
}