[QUOTE=SlaterB]“Eine ordnungsgemäße Beendigung von Ausgaben in den Ausgabefenstern
wurde durch Implementierung des Interface „DokumentAusgabeIF“ erreicht.”
bezieht sich das auf eine bestimmte der vorhandenen Klassen?[/QUOTE]
Das bezieht sich auf die Klassen “TonDokumentAusgabe”, “MP3DokumentAusgabe” und “BildDokumentAusgabe”. Diese Klassen erstellen ein neues Fenster um das jeweilige Dokument wiederzugeben.
[QUOTE=SlaterB;21616]“wie sich im Projekt an der später ergänzten Klasse
„MP3DokumentAusgabe“ zeigt: Allzu leicht kann die Implementierung des Interface vergessen werden”
die Ausgabe-Klassen werden nirgendwo sonst im Klassendiagramm referenziert,
ist das alles theoretisch oder ist die Nutzung im Programm klar?
wenn man das Interface, die Methode vergisst, was passiert dann?[/QUOTE]
Das Programm arbeitet fehlerfrei. Wenn die Methode “ausgabeBeenden()” weggelassen wird, wird die Ausgabe nicht richtig beendet, z. B. spielt dann die Musik trotz schließen des Fensters weiter.
[QUOTE=SlaterB;21616]unschön kommt hinzu, dass andere Klassen als die Ausgabe-Klassen, nämlich die Document-Klassen, bereits documentAusgeben()-Methoden haben,
ist da ein Zusammenhang erkennbar, sollen diese Klassen jeweils ausgabeBeenden() aufrufen?[/QUOTE]
Die Dokument-Klassen rufen lediglich die jeweilige DokumentAusgabe-Klasse auf.
Ich poste mal den kompletten Code der MP3-Klassen.
private static final long serialVersionUID = 1L;
public MP3Dokument(String fileName, String filePath, String beschreibung) {
super(fileName, filePath, beschreibung);
}
@Override
public void dokumentAusgeben() {
new MP3DokumentAusgabe(this);
}
}```
import java.awt.Color;
import java.awt.Graphics;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;
public class MP3DokumentAusgabe extends JFrame implements DokumentAusgabeIF {
private static final long serialVersionUID = 1L;
private File mp3File;
private Player jlPlayer;
public MP3DokumentAusgabe(MP3Dokument mp3Dokument) {
mp3File = new File(mp3Dokument.getFilePath());
this.setTitle("Ausgabe MP3-Dokument");
this.setSize(300, 100);
this.setLocation(Konstanten.positionX(), Konstanten.positionY());
this.addWindowListener(new DokumentAusgabeEventHandler());
this.setContentPane(new JPanel() {
@Override
public void paintComponent(Graphics g) {
g.setColor(Color.BLUE);
g.drawString("Es erklingt \"" + mp3File.getName() + "\"", 20,
35);
}
});
this.setVisible(true);
// jetzt den Thread erzeugen und starten:
Thread playerThread = new Mp3Player();
// veranlasst die Ausführung von "run":
playerThread.start();
}
/*
* Sicherstellung der Multidokumentenausgabe mit (innerer) Thread-Klasse zum
* Ausführen des mp3-Players als Thread, da sonst die Anwendung blockiert
* wird, solange die Player#play-Methode arbeitet.
*/
class Mp3Player extends Thread {
@Override
public void run() {
this.playMP3();
}
public void playMP3() {
try {
FileInputStream inputStream = new FileInputStream(mp3File);
jlPlayer = new Player(inputStream);
jlPlayer.play();
// weiter erst nach Beendigung von "play":
} catch (FileNotFoundException fnfe) {
System.out.println(fnfe.toString());
} catch (JavaLayerException jle) {
System.out.println(jle.toString());
}
}
}
public void ausgabeBeenden() {
jlPlayer.close();
this.dispose();
}
}```