# Ist ein Runnable Jar File Platformunabhängig?



## icarus2 (19. Apr 2009)

Huhu

Ich hoffe mal das passt hier rein ^^

Ich habe gerade mein erstes kleines Spiel programmiert und dies in Eclipse als Runnable Jar file exportiert. Soweit ich weiss sollte dieses Platformunabhängig sein. Als ich es jedoch einem Kollegen von mir schicken wollte, der ein Mac user ist, konnte der das jar file nicht öffnen.

Hat wer ne Idee woran das liegen könnte/ kann mir jmd sagen wie ich so etwas Platformunabhängig hinkriege?

Mfg ica


----------



## SebiB90 (19. Apr 2009)

Also im prinzip ist nen jar file plattformunabhängig. Allerdings müssen ein paar Sachen gegeben sein. Der User muss natürlich Java installiert haben, also mindestens JRE. Dann müsste die Endung .jar richtig verknüpft sein, sonst klappt es per Doppelklick nicht. Programme wie z.B. WinRar reißen gerne auch .jar Endungen an sich.
Sollte das alles gegeben sein wäre die einzige Fehlerquelle noch, dass du externe Libs benutzt, die sich bei dir im classpath befinden, aber bei deinem Kollegen nicht. Daher diese entweder immer mitliefern oder ins eigene Jar File einbinden.


----------



## icarus2 (19. Apr 2009)

Hmm, also ich habe das ganze wie gesagt mit Eclipse exportiert. Eigentlich verwende ich nur Standardklassen au den Standardpaketen(java.awt, java.awt.event, javax.swing).

Eigentlich hat doch so gut wie jeder Rechner die JRE drauf oder nicht?


Hmm, keine Ahnung woran das liegen könnte. Ich frag mal n anderen MC user ob ers öffnen kann.


Thx für die Hilfe.


----------



## SebiB90 (19. Apr 2009)

icarus2 hat gesagt.:


> Eigentlich hat doch so gut wie jeder Rechner die JRE drauf oder nicht?


Nicht unbedingt bzw. kommt drauf an, ka wie es bei Macs ist. Evtl ist auch eine ältere Version drauf und es geht deswegen nicht.

Ist denn die Verknüpfung mit der Endung .jar richtig gesetzt?


----------



## icarus2 (19. Apr 2009)

Hmm, kann sein, dass da eine ätere Version drauf ist.

Es ist vom richtigen Typ das file, wird als executable jar file angezeigt. Aber zum sicher gehen hab ichs mal angehängt.

Kannst du es ausführen?


PS: Nicht erschrecken... ist mein aller erstes Spiel, das ich in kurzer Zeit programmiert habe ^^


----------



## SebiB90 (19. Apr 2009)

Ich kanns ausführen.
Zum Spiel:
Für den Anfang nicht schlecht. Allerdings die Geschwindigkeit des Balls im Verhältnis zum Balken/Spieler ist noch überarbeitungswürdig. Also man sollte den Balken besser frei bewegen können und/oder wenn man die Taste gedrückt hält, sollte sie der Balken ganze Zeit in die Richtung bewegen. Mehrfaches drücken ist irgendwie unschön, finde ich. Ka ob es so gewollt war oder nur die technische Umsetzung für die andere Variante fehlt.


----------



## icarus2 (19. Apr 2009)

Hmm, ja dann schau ich mal warum mein Kollege das nicht ausführen konnte.

Zum Spiel:
Eigentlich wollte ich das zuerst machen, dass man den Balken bewegen kann, indem man die Tasten einfach gedrückt hält. Aber der Einfachheit halber hab ich das dann mal weggelassen. Aber ich werde das jetzt gleich mal ändern 


Danke für die Tipps.


----------



## icarus2 (19. Apr 2009)

Das gehört jetzt nicht umbeding hier hinein, aber wo wir schon grad beim Thema sind...

Ich habe jetzt folgende Idee gehabt. Ich habe eine Klasse KeyBoardListener, die KeyListener und Runnable implementiert.

In der Methode KeyPressed() wird der Thread gestartet. Der Thread wird unterbrochen, indem die Taste losgelassen wird. Dieser Event wird in der Methode keyReleased() abgefangen und interrupt() wird aufgerufen. Dadurch solle der Thread unterbrochen werden. Aber irgendwie funktioniert was nicht richtig. Kann gut sein, dass ich was mit dem Thread und interrupt() verbockt habe. Ich habe noch nicht viel mit Threads programmiert.

Hier mal den Code:

[Java]
@Override
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()== KeyEvent.VK_RIGHT){
			direction = "right";
			key_pressed.start();					//The thread is started


		}
		else if(e.getKeyCode()==KeyEvent.VK_LEFT){
			direction = "left";
			key_pressed.start();
			System.out.println("Thread started");	//The thread is started
		}

	}

	@Override
	public void keyReleased(KeyEvent e) {
		if(e.getKeyCode()== KeyEvent.VK_RIGHT){
			key_pressed.interrupt();				//The thread is interrupted	
		}
		else if(e.getKeyCode()==KeyEvent.VK_LEFT){

			key_pressed.interrupt();				//The thread is interrupted
		}
	}

	@Override
	public void keyTyped(KeyEvent e) {

	}

	//Returns the x_speed of the shape
	public int get_x_speed_shape(){

		int a = x_speed_shape;
		x_speed_shape = 0;

		return a;
	}

	@Override
	public void run() {
		//While the Thread is running, there has to be a constant x_speed of the shape, until
		//the thread is interrupted (in the keyReleased()-Method).
		while(true) {
			if(direction == "right"){
				x_speed_shape = 10;
			}

			else if(direction == "left"){
				x_speed_shape = -10;
			}

			try {
				Thread.sleep(100);
			}catch(InterruptedException e) {
				System.out.println("Thread is interrupted ==> break");
				if(Thread.interrupted())
				break;
			}
		}
		x_speed_shape = 0;			//Speed = 0 (no key is Pressed)
	}
[/Java]

Kannst du mir sagen, was ich falsch mache?

Edit:
Mir ist grad aufgefallen, dass ich das eigentlich unnötig kompliziert mache mit dem Thread. Ich könnte ja auch einfach in der KeyListener Methode jeweils gleich die Geschwindigkeit setzen... keine Ahnung wiso ich da so etwas kompliziertes machen wollte :S

Aber würde mich trotzdem noch interessieren warum mein Thread nicht funktioniert.


----------



## Schandro (19. Apr 2009)

wegen dem unter mac ausführen: Eins meiner Programme hat auch nicht unter mac funktioniert, grund: 
(Achtung Halbwissen!)
Bei mac ist die höchste JRE Version unter der bei z.b. windows, d.h. du musst es mit einem älteren JDK compilen (den compile level kann man in Eclipse einstellen)

Wegen deinem Code:
Strings niemals mit == vergleichen!
immer s1.equals(s2) benutzen.

Außerdem würd sich für sowas eher ein int statt String anbieten und einige int-Konstanten, die jeweils für eine Direction stehen.
(oder en enum, das wäre aber schon ein bisschen fortgeschritten)


----------



## icarus2 (19. Apr 2009)

Aso, ok. Ich habe jetzt grad die höchste kompabilität gewählt vom compiler her, mal sehen obs klappen wird. Thx


Hast du ne Idee warum das oben nicht geht?


----------



## Schandro (19. Apr 2009)

Schandro hat gesagt.:


> Strings niemals mit == vergleichen!



..


----------



## icarus2 (19. Apr 2009)

Mist, hab ich übersehen.... hatte da vorher andere Werte drin und nicht mehr darauf geachtet.

Thx


----------



## icarus2 (20. Apr 2009)

Hab jetzt kurz eine Klasse geschrieben und MouseMotionListener implementiert. Finde man kann es am besten mit der Maus steuern.

Prog ist im Anhang ;-)


----------



## ModellbahnerTT (20. Apr 2009)

Das Programm ist mit java 1.6 kompiliert. vm ist nur 1.5.


----------

