Sound einfügen

UbuLin

Mitglied
Hallo zusammen,
Ich habe vor einem halben Jahr angefangen Java zu programmieren und dabei habe ich schon einige halb, oder ganz fertige Spiele entwickelt. Eins fehlte jedoch immer und zwar der Sound(Soundeffeckte, Hintergrundmusik, ...). Habe schon versucht im Internet nach einer lösung zu suchen. Hat immer fast funktioniert, aber es kam dann doch die ein oder andere Fehlermeldung. Kann mir vielleicht jemand ein CodeBeispiel geben. Am besten in meinem TestCode.
TestCode: Main
Java:
// Package
package testsound;

// Imports
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;

// TestSound Klasse (Hauptklasse)
public class TestSound extends JFrame {
   
    // Variablen
    private JFrame f;
    private JButton sound;
   
    static boolean playSound = false;
   
    // Konstruktor TestSound
    public TestSound() {
       
        // Hier wird das Frame erstellt
        f = new JFrame("TestSounds");
        f.setLayout(null);
        f.setSize(500, 500);
        f.setLocationRelativeTo(null);
        f.setResizable(false);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ///////////////////////////////////////////////////////////////
        // Hier wird der Button erstellt
        sound = new JButton("Hier kommt ein Sound");
        sound.setBounds((500 - 200) / 2, (500 - 60) / 2, 200, 60);
        sound.addActionListener((ActionEvent e) -> {
            if(e.getSource() == sound) {
                playSound = true;
                System.out.println("Button wurde Gedrückt");
            }
        });
        sound.setVisible(true);
        // Hier hinzugefügt
        f.add(sound);
        //////////////////////////////////////////////////////////////
        f.setVisible(true);
       
    }

    // Hauptmethode
    public static void main(String[] args) {
       
        // Hier werden die Klassen angegeben
        new Sound();
        new TestSound();

    }
   
}

TestCode Sound:
Java:
// Package
package testsound;

// Imports
import java.io.File;

// Klasse Sound
public class Sound {
   
    // Anhand dierser File soll die .wav Datei geladen werden
    static File soundFile = new File("rsc/timeBomb.wav");
   
    // Konstruktor Sound
    public Sound() {
       
    }
   
}

Mein Ziel ist im Prinzip das wenn man auf den Button drückt eine .wav Datei abgespielt wird.
Kann jemand von euch eventuel in der Sond Klasse einen Code für mich einfügen.
Die Sound Datei soll mit der File soundFile geladen werden.

Hoffe ich habe alles gut Auskommentiert, freue mich auf jede hilfreiche Antwort

Lg UbuLin
 
Es gibt mehrere Wege dafür.
Am einfachsten ist es wahrscheinlich, sich einen Clip aus dem AudioSystem zu holen, einen Sound per AudioInputStream zu laden, und den Clip zu starten.
Code:
final Clip clip = AudioSystem.getClip();
final AudioInputStream in = AudioSystem.getAudioInputStream(myFile);

clip.open(in);
clip.start();
 
Erstmal vielen Dank für die schnelle Antwort,

Es hat super funktioniert wenn der Button gedrückt wird wird die clip.start() Methode aufgerufen.
Jedoch wenn ich den Button zweimal drücke kommt kein Sound mehr.
Ich habe schonmal irgendwas von clip.loop oder so etwa gehört.
Kriegt man es irgendwie hin den Sound so oft wie man will abzuspielen ?

Lg UbuLin
 
Ich weiss nicht wie AudioSystem arbeitet und wie du es genau bei dir eingebaut hast. Aber kann es sein dass du das abspielen selber in einem Swing-Worker machen musst der einen Schalter bereitstellt der angibt ob er gerade einen Sound abspielt und den du dann im ActionListener abfragst ?
 
@UbuLin Das liegt daran, dass die Position vom Clip nach dem Abspielen ganz am Ende ist.
Du könntest z.B.
Code:
myClip.setFramePosition(0);
aufrufen und den Clip erneut abspielen.

Natürlich könntest Du auch einen neuen Clip erzeugen. Dann solltest Du aber in betracht ziehen, den AudioInputStream manuell zu lesen und die Bytes zu speichern, damit Du die Datei nicht jedes mal wieder lesen musst.
Dann bräuchtest Du die andere Methode "open" aufrufen.
 
Das mit dem
myClip.setFramePosition(0);
hat super funktioniert.

Gibt es irgendetwas das überprüft ob der Sound fertig abgespielt wurde?
 
Naja, es gibt eine Methode Clip#getFrameLength und eine Methode Clip#getFramePosition.
Wenn Du die beiden nun vergleichst... 😉
 

Neue Themen


Zurück
Oben