# Probleme mit einem Applet



## Stefan1200 (24. Okt 2003)

Ich habe ein Problem mit einem Applet das ich geschrieben habe (Source weiter unten).
Offline funktioniert das Ding wunderbar. Sobald ich es online stelle, spielt er mir nur die erste Midi Datei ab. Sobald ich mein Next (|>) oder Prev (<|) Button benutze, die offline noch wunderbar funktioniert haben, hört er mit dem Spielen auf, und macht nichts mehr. Habt Ihr eine Idee warum?

Desweiteren habe ich das Problem, das ich auf Rechnern mit der Java VM 1.1 (alt, ich weiß) eine Security Exception bekomme, bei dem Befehl System.getProperty("java.vm.version"). Wie bekommt man das weg? Ich meine, ein schlimmer Befehl ist es ja nicht ;-).

Auf meinem eigenen HTTP Server, mein HTTP Server ist als Java Application programmiert, sieht es genauso aus, wie auf einen öffentlichen Server online. Und zwar bringt das Applet eine Anfrage, mit dem mein HTTP Server nichts anfangen kann. Was muss ich an meinen Applet ändern, damit das funktioniert? Die Anfrage lautet so:

GET /META-INF/services/javax.sound.sampled.spi.AudioFileReader HTTP/1.1
GET /META-INF/services/javax.sound.midi.spi.MidiFileReader HTTP/1.1


Mein Applet Source:


```
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class JMidiApplet extends Applet
implements ActionListener
{
	String[] midiDB = {"infinity.mid", "igotto.mid", "beverlyh.mid", "whatcan.mid", "macgyver.mid"};
	String javaVersion = System.getProperty("java.vm.version","Ups, keine!?!");
	String javaURL = "http://java.sun.com";
	boolean javaGood = true;
	int musPointer = 0;

	Panel pButtons = new Panel(new FlowLayout());
	Button bPlay = new Button(">");
	Button bStop = new Button("^");
	Button bPrev = new Button("<|");
	Button bNext = new Button("|>");
	Label lStatus = new Label();
	AudioClip midiFile;

	public JMidiApplet()
    {
	}

	public void actionPerformed(ActionEvent e)
	{
		if (javaGood)
		{
			if (e.getActionCommand().equals(">"))
			{
				midiFile.loop();
				bPlay.setEnabled(false);
				bStop.setEnabled(true);
				changeStatus();
			}
			else if (e.getActionCommand().equals("^"))
			{
				midiFile.stop();
				bPlay.setEnabled(true);
				bStop.setEnabled(false);
				lStatus.setText("Stopped");
			}
			else if (e.getActionCommand().equals("<|"))
			{
				bPlay.setEnabled(false);
				bStop.setEnabled(true);

				switch (musPointer)
				{
					case 0: bPrev.setEnabled(false);
							break;
					case 1: bPrev.setEnabled(false);
							midiFile.stop();
							--musPointer;
							chooseMidi(musPointer);
							midiFile.loop();
							break;
					case 2:
					case 3: midiFile.stop();
							--musPointer;
							chooseMidi(musPointer);
							midiFile.loop();
							break;
					case 4: bNext.setEnabled(true);
							midiFile.stop();
							--musPointer;
							chooseMidi(musPointer);
							midiFile.loop();
							break;
				}
				changeStatus();
			}
			else if (e.getActionCommand().equals("|>"))
			{
				bPlay.setEnabled(false);
				bStop.setEnabled(true);

				switch (musPointer)
				{
					case 0: bPrev.setEnabled(true);
							midiFile.stop();
							++musPointer;
							chooseMidi(musPointer);
							midiFile.loop();
							break;
					case 1:
					case 2: midiFile.stop();
							++musPointer;
							chooseMidi(musPointer);
							midiFile.loop();
							break;
					case 3: bNext.setEnabled(false);
							midiFile.stop();
							++musPointer;
							chooseMidi(musPointer);
							midiFile.loop();
							break;
					case 4: bNext.setEnabled(false);
							break;
				}
				changeStatus();
			}
		}
	}

	public void init()
	{
		parseParams();
		if (!checkJavaVersion())
		{
			lStatus.setText("Old Java VM, please update!");
		}
		chooseMidi(0);

		setLayout(new GridLayout(2,1));
		bPlay.addActionListener(this);
		bPlay.setEnabled(true);
		bStop.addActionListener(this);
		bStop.setEnabled(false);
		bPrev.addActionListener(this);
		bPrev.setEnabled(false);
		bNext.addActionListener(this);
		bNext.setEnabled(true);
		pButtons.add(bPlay);
		pButtons.add(bStop);
		pButtons.add(bPrev);
		pButtons.add(bNext);

		add(pButtons);
		add(lStatus);
	}

	public void start()
	{

	}

	public void stop()
	{

	}

	public void destroy()
	{
		midiFile.stop();
	}

	private void changeStatus()
	{
		lStatus.setText("Playing " + midiDB[musPointer] + "...");
	}

	private void chooseMidi(int pointer)
	{
		midiFile = getAudioClip(getCodeBase(), midiDB[pointer]);
	}

	private void parseParams()
	{
		if (getParameter("JavaURL") != null)
		{
			if (getParameter("JavaURL").startsWith("http://"))
			{
				javaURL = getParameter("JavaURL");
			}
		}
	}

	private boolean checkJavaVersion()
	{
		if (javaVersion.indexOf("1.1") != -1)
		{
			javaGood = false;
			openURL(javaURL, "_blank");
		}
		else if (javaVersion.indexOf("1.0") != -1)
		{
			javaGood = false;
			openURL(javaURL, "_blank");
		}

		return javaGood;
	}

	private void openURL(String url, String target)
	{
		try
		{
			getAppletContext().showDocument(new URL(url), target);
		}
		catch (MalformedURLException e)
		{
		}
	}

	public String[][] getParameterInfo()
	{
		String[][] paramInfo = {
			{"JavaURL","String","URL to the Java RE download page!"},
			};
		return paramInfo;
	}

	public String getAppletInfo()
	{
		return "JMidiApplet 0.1 (23.10.2003) - " +
			"(c) 2003 by Stefan Martens and Smart Software Development - " +
			"http://www.stefan1200.de";
	}
}
```


----------



## Stefan1200 (24. Okt 2003)

Hier noch ein Online Link, auf dem man sich das Verhalten online anschauen kann:

http://stefan1200.highantdev.de/JMidiApplet/JMidiApplet.html


----------



## Stefan1200 (24. Okt 2003)

Ich habe heraus gefunden, das nur Opera diese download Probleme der Midi Dateien hat.
Ist dieses Problem in Verbindung mit Opera bekannt?
Und zwar scheint es mir, das Opera es nicht rafft, die Midi Dateien herunter zu laden.
Gibt es eine andere Möglichkeit die Midi Datei per getAudioClip oder ähnliches zu bekommen?


----------

