Como tocar som ao pressionar um JButton?

Estou fazendo um jogo e gostaria de colocar um som quando o JButton fosse clicado, alguém sabe como eu posso fazer isso?

Neste capítulo do The Java Tutorials, tem toda a explicação detalhada, acho que vai te ajudar.

Dei uma olhada no site que você me passou e mais umas pesquisadas e consegui isto:

@Override
public void actionPerformed(ActionEvent e) {
	if(e.getSource() == this.btnGame) {
		if(!(fis == null)) {
			play(fis, false);
		} else {
			try {
				fis = new FileInputStream(somClickPath);
				play(fis, false);
			} catch (FileNotFoundException e1) {
				JOptionPane.showMessageDialog(null, "O caminho do audio não pode ser encontrado: \n"
						+ e1.getMessage(), "Zumbi", JOptionPane.ERROR_MESSAGE);
			}
		}
		
	}
}
public void play(final InputStream somPath, final boolean restart) {
	try {
		//Obtem os dados sonoros
		AudioInputStream ais = AudioSystem.getAudioInputStream(somPath);
		
		//Carrega o formato do audio e cria uma linha
		AudioFormat af = ais.getFormat();
		DataLine.Info dataLineInfo = new DataLine.Info(MenuGui.class, ais.getFormat(),
				((int)ais.getFrameLength() * af.getFrameSize()));
		
		//Carrega o som para o dispositivo
		Clip clip = (Clip)AudioSystem.getLine(dataLineInfo);
		clip.addLineListener(new LineListener() {

			//Evento do Listener
			public void update(LineEvent e) {
				if(e.getType() == LineEvent.Type.STOP) {
					e.getLine().close();
				}
			}
		});
		clip.open(ais);
		
		//Tocar som
		if(restart) {
			clip.loop(clip.LOOP_CONTINUOUSLY);
		} else {
			clip.loop(0);
		}
	} catch(Exception e) {
		e.printStackTrace();
		JOptionPane.showMessageDialog(null, "Erro na reprodução do audio:\n" + e.getMessage(), "Zumbi ",
				JOptionPane.ERROR_MESSAGE);
	}
}

}

Só que quando eu clico no botão ele lança essa Exception:

java.io.IOException: mark/reset not supported

Alguma ideia do que pode ser?

Posta o StackTrace do erro :slight_smile:

Se antes de passar para o AudioSystem, você decorar seu InputStream com um BufferedInputStream, pode funcionar pois o BufferedInputStream suporta os métodos mark e reset.

Tente assim:

BufferedInputStream bufferedInput = new BufferedInputStream( somPath );
AudioInputStream ais = AudioSystem.getAudioInputStream( bufferedInput );

Pronto aquele erro sumiu, mas agora está dando outro:

java.lang.IllegalArgumentException: No line matching class br.paulo.game.gui.MenuGui supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian, and buffers of 211680 to 211680 bytes is supported.
at javax.sound.sampled.AudioSystem.getLine(Unknown Source)
at br.paulo.game.gui.MenuGui.play(MenuGui.java:91)
at br.paulo.game.gui.MenuGui.actionPerformed(MenuGui.java:70)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

E quando eu clico novamente no botão ele me da este outro:

java.io.IOException: Resetting to invalid mark

MenuGui.class não é uma classe válida para reproduzir audio.

Creio que tens que fazer assim:

DataLine.Info dataLineInfo = new DataLine.Info(Clip.class, ais.getFormat(),				((int)ais.getFrameLength() * af.getFrameSize()));
//Carrega o som para o dispositivo
Clip clip = (Clip) AudioSystem.getLine(dataLineInfo);

Funcionou, vlw

1 curtida