# Hintergrundmusik eines Spiels mit Hilfe von JLayer



## Thanatos (1. Jun 2015)

Hallo zusammen,
wie der Titel schon sagt, beschäftige ich mich mit einem Spiel, welches natürlich auch eine passende Hintergrundmusik braucht! 
Ich bin blutiger Java-Anfänger (arbeite mit Eclipse) und habe noch nicht wirklich viel Ahnung...
Nun zu meiner Frage:  Wie kann ich ein langes Lied (mp3), das sich immer wieder wiederholt, mit Hilfe von JLayer (von mir aus auch anders) mit Java abspielen?
Ich habe bereits stundenlang (also wortwörtlich) nach passenden Beispielen gesucht, jedoch ging davon nichts bei mir.

Schonmal vielen Dank für eure Hilfe und falls euch meine Frage zu ungenau ist, einfach nachfragen! 

Thanatos


----------



## Major_Sauce (1. Jun 2015)

audio - How can I play sound in Java? - Stack Overflow

3 Sekunden Google...

mfg Major


----------



## Thanatos (1. Jun 2015)

```
public static synchronized void playSound(final String url) {
  new Thread(new Runnable() {
  // The wrapper thread is unnecessary, unless it blocks on the
  // Clip finishing; see comments.
    public void run() {
      try {
        Clip clip = AudioSystem.getClip();
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(
          Main.class.getResourceAsStream("/path/to/sounds/" + url));
        clip.open(inputStream);
        clip.start(); 
      } catch (Exception e) {
        System.err.println(e.getMessage());
      }
    }
  }).start();
}
```


Geht bei mir aber leider nicht. Ich habe diesen Thread bereits einmal gefunden gehabt und den Code ausprobiert, habe aber eine Fehlermeldung (Und nein, nicht der Pfad  ).
In der ersten Zeile bekomme ich multiple Fehlermeldungen:
Syntax error on token "void", @ expected
Syntax error on token "final", @ expected 
Syntax error on token(s), misplaced construct(s)



Wie gesagt, ich bin absoluter Anfänger, und brauche einfach verständliche Hilfe. 
Ich investiere gerne viel Zeit, aber bitte seid nicht all zu hart, jeder muss ja mal anfangen!


----------



## Major_Sauce (1. Jun 2015)

Der Fehler scheint zu entstehen da deine Methode falsch plaziert ist.
Wäre super wenn du einfach mal deine ganze Klasse hier posten könntest.
Ach ja, wenn du auf "Erweitert" gehst, beim Antworten, dann findest du oben bei den Icons eine Java-Tag Button, wenn du deinen Code da rein tippst dann wird das auch in der Java ansicht angezeigt

Sieht dann etwa so aus:

Hier ein tag...
    if(i == 0){
        System.out.println("Ich mag Kekse");
    }
Hier endtag...

Ergebnis: 


```
if(i == 0){
        System.out.println("Ich mag Kekse");
    }
```


----------



## Thanatos (1. Jun 2015)

Das war doch eine sehr nützliche Antwort! Vielen Dank schonmal dafür!
Die erste Fehlerquelle konnte ich jetzt beseitigen, ein Leichtsinnsfehler meinerseits....
Okay vielen Dank, werde das in Zukunft mit dieser Möglichkeit machen.
Aber nun zum bisherigen Code:

[Java]
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class Test5 {


public static synchronized void Test5 (final String url) {
  new Thread(new Runnable() {
  // The wrapper thread is unnecessary, unless it blocks on the
  // Clip finishing; see comments.
    public void run() {
      try {
        Clip clip = AudioSystem.getClip();
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(
          Main.class.getResourceAsStream("C:\\Users\\Thanatos\\Desktop\\19 Titel 19.wav"));
        clip.open(inputStream);
        clip.start(); 
      } catch (Exception e) {
        System.err.println(e.getMessage());
      }
    }
  }).start();

}
}
[/Java]


Fehlercode:

Fehler: Hauptmethode in Klasse Test5 nicht gefunden. Definieren Sie die Hauptmethode als:
public static void main(String[] args):
oder eine JavaFX-Anwendung muss javafx.application.Application erweitern




Danke für die Hilfe!


----------



## Major_Sauce (2. Jun 2015)

Morgen, 

Steht doch ganz klar drin, dein Projekt hat keine Hauptmethode.
Du musst die main Methode implementiere

Tuh der Welt einen Gefallen und benenne die Test5-methode anders. playSound() oder sowas.
Methoden sollten nie den namen der Klasse besitzen, das ist nicht "elegant".


```
public static void main(String[] args){
    new Test5().playSound();
}
```


----------



## Thanatos (2. Jun 2015)

Tut mir leid, ich kenne mich nunmal mit Programmieren und "Programmierethik" nicht wirklich aus! 


```
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class Test5 {


public static synchronized void playsound (final String url) {
  new Thread(new Runnable() {
  // The wrapper thread is unnecessary, unless it blocks on the
  // Clip finishing; see comments.
    public void run() {
      try {
        Clip clip = AudioSystem.getClip();
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(
          Main.class.getResourceAsStream("C:\\Users\\Thanatos\\Desktop\\19 Titel 19.wav"));
        clip.open(inputStream);
        clip.start(); 
      } catch (Exception e) {
        System.err.println(e.getMessage());
      }
    }
  }).start();

}
public static void main(String[] args){
    new Test5().playSound();
}
}
```



Fehlermeldung:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:  
playsound cannot be resolved to a type
at Test5.main(Test5.java:27)


bei: 

```
Main.class.getResourceAsStream("C:\\Users\\Thanatos\\Desktop\\19 Titel 19.wav"));
```

bekomme ich weiterhin folgende Fehlermeldung:

"Main cannot be resolved to a type"   .


Ich entschuldige mich wirklich für meine Unwissenheit, ich mag es auch nicht andere Leute zu belästigen! :noe:


----------



## Major_Sauce (2. Jun 2015)

Nabend, 

ich möchte dich hier nicht niedermachen (war eher ein Gag)
Du belästigst hier auch niemanden, dafür ist das Forum ja gedacht, wobei ich sagen muss dass man da auch mit ein wenig Recherche auf ähnliche Beiträge kommt.
Ist aber gar kein Problem, was mich interessieren würde: Benutzt du eine IDE (z.B Eclipse oder Netbeans).

Zu deinem Problem:

Ich weiß nicht wie die Klass Test5 bei dir verbaut ist. 
Ich weiß auch nicht wo du das "Main.class.getResourceAsStream(...)" her hast, jedoch gibt es im Moment 2 Möglichkeiten:

1. Die Klasse Test5 liegt in einem Projekt welche die Klasse "Main.class" besitzt. In diesem Fall sollte die Main-Methode bereits in der Main.class enthalten sein oder man sollte sie dort hin verschieben.

2. Die Klasse Test5 ist die Main-class deines Projekts, das würde heißen dass deine Zeile :


```
AudioInputStream inputStream = AudioSystem.getAudioInputStream(Main.class.getResourceAsStream("C:\\Users\\Thanatos\\Desktop\\19 Titel 19.wav"));
```

eher so aussehen sollte: 


```
AudioInputStream inputStream = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("C:\\Users\\Thanatos\\Desktop\\19 Titel 19.wav"));
```

oder du lässt die so wie sie war, musst dann aber noch die Main-Klasse importieren. Dies funktioniert folglich nur, wenn es schon eine Main.class gibt.

mfg Major


----------



## Thanatos (2. Jun 2015)

Hallo Major,
ich benutze Eclipse.
Was ich hier als Code gepostet habe ist der einzige Code in dem Java-Projekt, zu finden unter src->(default package)->Test5.java->Test5.
In der JRE System Library befinden sich dann noch die JLayer-Bibliothek....
Wie ich oben bereits gesagt habe, habe ich über google nichts wirklich brauchbares gefunden, ansonsten hätte ich hier ja keinen post gemacht!  Aber danke dafür, dass du so geduldig bist!
Mein Projekt besitzt bisher nur die Klasse Test5, es ist außer dieser nichts vorhanden.
Eine main-class existiert folglich nicht.
Falls möglich würde ich gerne nur eine Klasse zur Umsetzung benutzen, das finde ich persönlich irgendwie angenehmer...
Ich weiß es ist viel verlangt, aber könntest du mir anhand dem von mir oben geposteten code eine funktionierende variante posten? Ich glaube, das würde mir mehr helfen, da ich mit deinen Lösungen leider nicht viel anfangen kann! Diese sind zwar sicher gut erklärt, aber ich bin nunmal absoluter Neuling. 


```
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class Test5 {


public static synchronized void playsound (final String url) {
  new Thread(new Runnable() {
  // The wrapper thread is unnecessary, unless it blocks on the
  // Clip finishing; see comments.
    public void run() {
      try {
        Clip clip = AudioSystem.getClip();
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("C:\\Users\\Thanatos\\Desktop\\19 Titel 19.wav"));
         clip.open(inputStream);
        clip.start(); 
      } catch (Exception e) {
        System.err.println(e.getMessage());
      }
    }
  }).start();

}
public static void main(String[] args){
    new Test5().playSound();
}
}
```

Ich hoffe, ich habe deine Erklärung richtig angewendet.
Leider habe ich immer noch folgende Fehlermeldung:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
The method playSound() is undefined for the type Test5
at Test5.main(Test5.java:26)


----------



## Major_Sauce (2. Jun 2015)

Bitte ändere die Bezeichnung deines Packages zu "main"

hier der Code, sollte funktionieren...


```
package main;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class Test5 {

	public static synchronized void playSound(final String url) {
		new Thread(new Runnable() {
			public void run() {
				try {
					Clip clip = AudioSystem.getClip();
					AudioInputStream inputStream = AudioSystem.getAudioInputStream(getClass().getResourceAsStream(url));
					clip.open(inputStream);
					clip.start();
				} catch (Exception e) {
					System.err.println(e.getMessage());
				}
			}
		}).start();
	}

	public static void main(String[] args) {
		playSound("C:\\Users\\Thanatos\\Desktop\\19 Titel 19.wav");
	}
}
```

mfg major


----------



## Thanatos (2. Jun 2015)

Super danke, ich habe jetzt auch endlich den vernünftigen Aufbau verstanden! 
Ich weiß, wurde auch mal Zeit. 
Es wird mir nun keine Fehlermeldung mehr angezeigt, jedoch steht in der Console nur in roter Schrift "null". Was hat das zu bedeuten? Das der Inputstream den Wert 0 hat? Oder wie ist das zu verstehen?

Wirklich vielen Dank, du hast mir bisher super geholfen!


----------



## Major_Sauce (2. Jun 2015)

Da bin ich mir jetzt nicht ganz sicher, aber ich glaube getResourceAsStream kann blos auf der Source ordner zugreifen. Zieh die sound datei mal direkt in den src ordner und versuch dann als pfad einfach nur "19 Titel 19.wav".
Ich weiß auch nicht ob die Leerzeichen im Titel möglicher Weise Probleme machen.

mfg Major


----------



## Thanatos (2. Jun 2015)

Bringt mit leider beides nichts... 

java - getResourceAsStream returns null - Stack Overflow

wie ist das zu verstehen? also die beide kommentare mit der besten wertung?


----------

