2013-11-21 4 views
1

В приложении Java, как можно выводить звук в функцию красок? Я пробовал этот код:Java Audio in paint function

public static void Player(String audioname){ //For audio 
    InputStream in = null; 
    try{ 
     in = new FileInputStream (new File (audioname)); 
    } 
    catch (FileNotFoundException e){ 
     System.err.print("Audio file not found!"); 
    } 
    try{ 
     as = new AudioStream (in); 
    } 
    catch (IOException e){ 
     System.err.print("AudioStream couldn't be created!"); 
    } 
} 
//////////////////////////////////////////////////////////////// 
try{ 
    Player(name); 
    AudioPlayer.player.start(as); 
} catch(Exception f){ 
    System.err.print("Audio couldn't be played!"); 
} 

... однако игрок попадает в выписку Exception f catch. Я также попытался поместить его в другом месте (как отдельный метод, что краска звонки, но он все еще не работает какой-либо помощь

Edit:.?

class playAudio implements Runnable{ 
    public void run(){ 
     try{ 
      Player("countdown.wav"); 
      AudioPlayer.player.start(as); 
     } catch(Exception f){ 
      System.err.print("Audio couldn't be played!"); 
     } 
    } 
} 
/////////////////////////////////////// 
public void paint(Graphics g){ //Draw function 
    Graphics2D g2d = (Graphics2D) g; 
    /////////////////////////////////// 
    Thread audioThrd = new Thread(new playAudio()); 
    audioThrd.start(); 
} 

Здесь я добавил нить для воспроизведения аудиофайла, но «Звук не воспроизводится!» все еще показывает. Что я здесь делаю неправильно?

+0

'' ... выводить аудио в функцию краски? "' - это утверждение для меня не имеет смысла. Измените свой блок catch, чтобы напечатать stacktrace, 'f.printStackTrace()', и покажите нам результат. Вы могли бы очень хорошо искать место для hte-файла. –

+1

Мои первые впечатления, не надо. 'paint' - это сделать как можно быстрее и не должно быть возиться с попыткой загрузить ресурсы ... – MadProgrammer

+0

' public void paint (Graphics g) {...} ' – Avadonia

ответ

3

Нет, никогда не делайте звук внутри краски. Методы рисования предназначены только для рисования и рисования ослепляюще быстро. Чем медленнее ваши методы рисования, тем менее оперативна ваша программа будет казаться пользователям. Запуск аудио создаст длительный процесс, и если бы это произошло внутри краски, Этот графический интерфейс вашей программы остановится, а не то, что вы хотите.

Вместо этого вы хотите воспроизводить звук в фоновом потоке от потока событий Swing. SwingWorker может работать хорошо, но так может и любая старая разновидность сада.


Редактировать
Что касается этого кода:

public void paint(Graphics g){ //Draw function 
    Graphics2D g2d = (Graphics2D) g; 
    /////////////////////////////////// 
    Thread audioThrd = new Thread(new playAudio()); 
    audioThrd.start(); 
} 

Опять же, не делают этого. Пожалуйста, поймите, что у вас нет контроля над тем, когда или даже если * краска получает вызов, так как это контролируется JVM. Вы можете предположить, что его вызывают, вызывая repaint(), но это не гарантируется, что работает, особенно если repaint запрашивает «стек» вверх. Также обратите внимание, что JVM может вызывать краску, когда вы ее не запрашиваете, например, когда операционная система уведомляет ее о том, что одно из ее окон «грязно» и нуждается в перекраске.

Таким образом, нижняя строка:

НЕ ПЫТАЮТСЯ ИГРАТЬ МУЗЫКУ ИЗНУТРИ PAINT ИЛИ PAINTCOMPONENT

А почему ваш код не играет музыку, вы реализовать свой printStackTrace() рекомендацию еще?


Далее мы будем говорить о том, почему вы не должны делать рисунок внутри paint(Graphics g), но вместо этого он должен сделать свой рисунок внутри paintComponent(Graphics g) метода вашего JComponent вместо этого.