# Eclipse Applets und ich bekomm langsam nen Hass



## Kaladial (9. Nov 2007)

moin

also folgendes: 
ich habe ein kleines applet geschrieben welches von ner kamera nen bild holt und auf nem label anzeigt ... 
das ganze soll in nem thread laufen der die bilder abholt... 

mein problem: wenn ich das applet ausführen will compiliert er es nicht bzw nur selten ... 
also ich hab jetzt folgenden code:


```
package AVS3;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import javax.swing.JButton;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JApplet;

import javax.swing.*;
import java.awt.Dimension;

public class APPAnzeigeLiveBild extends JApplet {
	boolean setgo=false;
	boolean thread_is_start=false;
	private JPanel jContentPane = null;
	private JLabel jLabelBild = null;
	private JButton jButtonConsoleStart = null;
	private JButton jButtonConsoleStop = null;	
	private JPanel jEast = null; 
	private JPanel jEastC = null; 
	private JPanel jCenter = null;
	public Lock lock = new ReentrantLock();  //  @jve:decl-index=0:
    public String ip = "";  //  @jve:decl-index=0:
    int mainframe_x=0;
    int mainframe_y=0;
    int bild_breite=0;
    int bild_hoehe=0;
    	
	public APPAnzeigeLiveBild() {
		super();
	}
    
    public JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJCenter(), BorderLayout.CENTER);
			jContentPane.add(getJEast(), BorderLayout.EAST);
			
			jContentPane.validate();
		}
		return jContentPane;
	}
    
    private JPanel getJCenter() {
		if (jCenter == null) {
			jLabelBild = new JLabel();
			jCenter = new JPanel();
			jCenter.setLayout(new BorderLayout());
			jCenter.setPreferredSize(new Dimension(100, 100));
			jCenter.setBackground(Color.green);
			jCenter.add(jLabelBild,BorderLayout.CENTER);
			jCenter.setVisible(true);
		}
		return jCenter;
	}
    
	private JPanel getJEast() {
		if (jEast == null) {
			jEast = new JPanel();
			jEast.setLayout(new BorderLayout());
			jEast.setPreferredSize(new Dimension(100, 100));
			jEast.setBackground(Color.cyan);
			jEast.add(getJEastC(),BorderLayout.CENTER);
			jEast.setVisible(true);
		}
		return jEast;
	}
	private JPanel getJEastC() {
		if (jEastC == null) {
			jEastC = new JPanel();
			jEastC.setLayout(null);
			jEastC.setPreferredSize(new Dimension(100, 100));
			jEastC.setBackground(Color.blue);
			jEastC.add(getJButtonConsoleStart(),null);
			jEastC.add(getJButtonConsoleStop(),null);
			jEastC.setVisible(true);
		}
		return jEastC;
	}

   	private JButton getJButtonConsoleStart() {
		if (jButtonConsoleStart == null) {
			jButtonConsoleStart = new JButton();
			jButtonConsoleStart.setText("Start");
			jButtonConsoleStart.setVisible(true);
			jButtonConsoleStart.setPreferredSize(new Dimension(80, 20));
			jButtonConsoleStart.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					startIt();
				}
			});
		}
		return jButtonConsoleStart;
	}

   	private JButton getJButtonConsoleStop() {
		if (jButtonConsoleStop == null) {
			jButtonConsoleStop = new JButton();
			jButtonConsoleStop.setPreferredSize(new Dimension(80, 20));
			jButtonConsoleStop.setText("Stop");
			jButtonConsoleStop.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					stopIt();
				}
			});
		}
		return jButtonConsoleStop;
	}

   	public Thread runner = new Thread() {
		public void run() {
			while (setgo) {
				System.out.println("test");
				try {
					jLabelBild.setIcon(Lade_Bild());
					try {
						sleep(10L);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} catch (Exception e) {
					e.printStackTrace();
				} 
			}
			runner.notify(); 
		}
	};

	public void startIt() {
		setgo=true;
		runner.start();
	}

	private void stopIt() {
		setgo=false;
	}
	
	public ImageIcon Lade_Bild(){
		Socket sock=null;
		BufferedOutputStream out=null;
		BufferedInputStream in=null;
		String[] rueck;
		int hoehe;
		int breite;
		byte[] bild;
		ImageIcon ico1=null;
		try { //Verbindung mit dem Cam herstellen       
			sock = new Socket(ip, 10000); //Hier die Domain eintragen
			out = new BufferedOutputStream(sock.getOutputStream());
			in = new BufferedInputStream(sock.getInputStream());

			//der folgende String enthält die zu übergebenden Variablen       
			String uebergabe = "getimagesize\n"; 

			out.write(uebergabe.getBytes());    
			out.flush();
			byte[] b = new byte[25];
			rueck = new String[25];
			int anz=0;
			int anz_off_b=0;
			anz_off_b = in.read(b,0,b.length);
		
			for(int i=0; i<anz_off_b; i++){
				String eing=""+(char) b[i];
				String vergl=" ";
				if((eing.compareToIgnoreCase(vergl)==0)||(eing.compareToIgnoreCase("\n")==0)){
					anz=anz+1;					
				}else{
					if(rueck[anz]!=null){
						rueck[anz]=rueck[anz]+""+eing;
					}else{
						rueck[anz]=""+eing;
					}
				}
			}
			breite = Integer.parseInt(rueck[1]);
			hoehe = Integer.parseInt(rueck[2]);
			int b_groesse = breite*hoehe;
			bild = new byte[b_groesse];
			
			in.close();
			out.close();
			sock.close();
			
			sock = new Socket(ip, 10000); //Hier die Domain eintragen
			out = new BufferedOutputStream(sock.getOutputStream());
			in = new BufferedInputStream(sock.getInputStream());
			
			
			String uebergabe1 = "snap\n";
			out.write(uebergabe1.getBytes());    
			out.flush();
			
			int anz_off=0;
			int anz_off_new=0;
			int off=0;
			int leng=b_groesse;
			
			anz_off = in.read(bild,off,leng);
			anz_off_new = anz_off;
			while (anz_off<b_groesse){
				off = anz_off;
				leng = leng - anz_off_new;
				anz_off_new = in.read(bild,off,leng);
				anz_off=anz_off+anz_off_new;
			}
			in.close();
			out.close();
			sock.close();

			//TODO: data Array mit Grauwerten füllen 
			BufferedImage img = new BufferedImage(breite, hoehe, BufferedImage.TYPE_BYTE_GRAY); 
			img.getRaster().setDataElements(0, 0, breite, hoehe, bild); 

			ico1 = new ImageIcon(img);
		} catch (IOException ex) {
			System.err.println("41"+ex.toString());
			//System.exit(1);
		}finally{
			try{
				if(in != null){
					in.close();
				}
				if(out != null){
					out.close(); 
				}
				if(sock != null){
					sock.close();
				}
			} catch (IOException ex) {
				System.err.println("5"+ex.toString());
				System.exit(1);
			}
		} 	
		return ico1;	
	}		
	
    public void init() { 
    	ip=""+getCodeBase().getHost();
    	//ip="10.0.88.150";
		this.setContentPane(getJContentPane());    	
    } 

    public void start() { 
    } 

    public void stop() {
    	stopIt();
    } 

    public void destroy() { 
    	stopIt();
    } 

    public void paint(Graphics g) { 
    	startIt();
    } 
}
```

als fehlermeldung bekomm ich :


```
java.lang.Error: Unresolved compilation problem: 
	The method removeThread(MultiCamThread) in the type APPAnzeigeLiveBild is not applicable for the arguments (new Thread(){})

	at AVS3.APPAnzeigeLiveBild.<init>(APPAnzeigeLiveBild.java:134)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at sun.applet.AppletPanel.createApplet(Unknown Source)
	at sun.applet.AppletPanel.runLoader(Unknown Source)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
```

The method removeThread(MultiCamThread) 

^^ diese zeile hab ich schon vor 5 min raus geschmiessen aber er compiliert es einfach net neu....
wie muss ich in eclipse vorgehn damit er mir immer jedesmal vor dem ausführen den code neu compiliert ... weil ich sitz hier wunder mich warum es net geht und dann seh ich das das überhaupt net der aktuelle code is den er da verwenden will is doch zum junge hunde kriegen... 

also thx für hilfe 
mfg Kala


----------



## Wildcard (9. Nov 2007)

Im Menü 'Project' muss build automatically ausgewählt sein.


----------



## Kaladial (12. Nov 2007)

hi

ok das war ausgewählt aber is gut so weiß ich wenigstens wie ich es per hand ausführen kann ... 

was mich trotzdem irittiert is:
wenn ich es unter eclipse ausführe funktioniert es also es wird das bild + die buttons angezeigt... (zumindestens wenn ich nen border-layout benutze (null layout geht net)) 

wenn ich nun diese class-files auf meine cam schiebe und die website aufrufe wird nur noch das livebild angezeigt die buttons aber nicht... woran kann denn das liegen?

mfg Kala


----------



## The_S (12. Nov 2007)

Wird eine Exception geworfen? Vermutlich eine SecurityException?


----------



## Kaladial (12. Nov 2007)

hmmm also nicht das ich wüsste aber wo soll ich das im ie auch sehen? also fals du unten links meinst nein da kommt nix


----------



## Kaladial (12. Nov 2007)

und diees dumme eclipse aktuallisiert trotzdem die class files nicht ordentlich... 

ich habe eben mal einfach nen fehler eingebaut indem ich das mittelframe ausgeblendet hab... wenn ich das im eclipse starte geht es aber wenn ich das ganze dann auf die cam lade und ausführe is da imemr noch nen bild zu sehn ... verflucht nochmal...


----------



## The_S (12. Nov 2007)

Die Fehlermeldung siehst du in der Java-Konsole deines Browsers. 

Zu deinem Eclipse Problem: Meistens sitzt der Fehler vor dem Bildschirm. Wie auch vermutlich in diesem Fall. Ein derartiges Verhalten von Eclipse konnte ich bis jetzt nämlich nicht nachvollziehen.


----------



## Kaladial (12. Nov 2007)

hmmm also in der java konsole kommt keine fehlermeldung...

und jo normal sitzt der vor dem bildschirm der fehler... aber trotzdem... 
es kann eigentlich nicht sein... 
ich führe das applet unter eclipse aus und es geht nun kopier ich die class files auf mein uclinux und führ es aus und es macht das was es vor meinem umbau des codes gemacht hat? 

sorry aber wo genau soll da mein fehler liegen?


----------



## The_S (12. Nov 2007)

Meistens passiert sowas, weil dein Applet nicht signiert ist und damit in der Sandbox läuft, wodurch bestimmte Funktionen nicht verwendet werden dürfen. Aber da du ja keine Exception bekommst, kann man das wohl ausschließen!?


----------



## Wildcard (12. Nov 2007)

Kaladial hat gesagt.:
			
		

> und diees dumme eclipse aktuallisiert trotzdem die class files nicht ordentlich...
> 
> ich habe eben mal einfach nen fehler eingebaut indem ich das mittelframe ausgeblendet hab... wenn ich das im eclipse starte geht es aber wenn ich das ganze dann auf die cam lade und ausführe is da imemr noch nen bild zu sehn ... verflucht nochmal...


Das was Eclipse ausführt ist Stand der Dinge, an den Class Files liegt es also nicht. Applets und Webstart Anwendungen werden von Java allerdings in einem Cache abgelegt und daher nicht automatisch aktualisiert wenn du die class Files änderst. Als Entwickler solltest du den Java Cache deaktivieren.


----------



## Kaladial (12. Nov 2007)

```
FTPClient client = new FTPClient();
		try{
			client.connect(camIP);
			client.login(GlobaleVariablen.cam_login_name, GlobaleVariablen.cam_login_pw);
			client.changeWorkingDirectory(GlobaleVariablen.cam_dir);
			client.setFileType(FTPClient.BINARY_FILE_TYPE); 
			client.storeFile(dateiname, new FileInputStream(new File(dateiname))); 
			
			if(APPLiveBild){
				String app_dir=GlobaleVariablen.cam_dir+"/AVS3";
				client.makeDirectory(app_dir);
				client.changeWorkingDirectory(app_dir);
				client.setFileType(FTPClient.BINARY_FILE_TYPE); 
				client.storeFile("APPAnzeigeLiveBild.class", new FileInputStream(new File("bin/AVS3/APPAnzeigeLiveBild.class")));
	
				client.setFileType(FTPClient.BINARY_FILE_TYPE); 
				client.storeFile("APPAnzeigeLiveBild$1.class", new FileInputStream(new File("bin/AVS3/APPAnzeigeLiveBild$1.class")));

				client.setFileType(FTPClient.BINARY_FILE_TYPE); 
				client.storeFile("APPAnzeigeLiveBild$2.class", new FileInputStream(new File("bin/AVS3/APPAnzeigeLiveBild$2.class")));
				
				client.setFileType(FTPClient.BINARY_FILE_TYPE); 
				client.storeFile("APPAnzeigeLiveBild$3.class", new FileInputStream(new File("bin/AVS3/APPAnzeigeLiveBild$3.class")));

			}
			client.disconnect();
		}catch(IOException iox){System.out.println(iox);}
```

also so kopier ich das ja rüber ... 



> Das was Eclipse ausführt ist Stand der Dinge, an den Class Files liegt es also nicht. Applets und Webstart Anwendungen werden von Java allerdings in einem Cache abgelegt und daher nicht automatisch aktualisiert wenn du die class Files änderst. Als Entwickler solltest du den Java Cache deaktivieren.



^^ hab noch nie mit applets gearbeitet ... wie schalt ich denn den cache aus?


----------



## The_S (12. Nov 2007)

Anders gefragt: Verwendet dein Applet eine Methode/Klasse, die in einem Applet von der Sandbox eingeschränkt wird? Und falls ja, hast du das Applet signiert?


----------



## Kaladial (12. Nov 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Anders gefragt: Verwendet dein Applet eine Methode/Klasse, die in einem Applet von der Sandbox eingeschränkt wird? Und falls ja, hast du das Applet signiert?



wat? sorry sagt mir jetzt mal gar nix..
1. post ist mein komplettes applet gepostet


----------



## The_S (12. Nov 2007)

Dann informier dich mal im Internet oder hier im Forum über die "Sandbox". Ich hab wenig lust (vorallem ohne Exception etc.) ein komplettes Applet zu analysieren. Ich vermute aber mal, dass der Sockets und deine Streams wohl eine SecurityException auslösen könnten. Auch deine Locks würde ich nochmal genauer unter die Lupe nehmen (ohne jetzt jemals etwas mit diesen Klassen gemacht zu haben).


----------



## Wildcard (12. Nov 2007)

Kaladial hat gesagt.:
			
		

> ^^ hab noch nie mit applets gearbeitet ... wie schalt ich denn den cache aus?


Hängt von deinem Betriebssystem ab. Alternativ kannst du auch die Java Konsole öffnen, den Classloader Cache dort leeren und die Seite neu laden.


----------



## Kaladial (12. Nov 2007)

also ich hab jetzt den classloader cache geleert und mir ne seite auf meinen rechner gebastelt das das applet anzeigt wenn ich diese seite aufrufe wird das ohne probleme ausgeführt 

wenn ich nun die class dateien auf meine kamera kopiere wo als webserver boa läuft unter uclinux dann zeigt der mir immer noch nicht die richtigen seite an bzw nur das bild nicht aber die steuerelemente ... 

also so langsam bekomm ich wieder den hass von vor dem we als ich den thread geschrieben hab ...


----------



## Wildcard (12. Nov 2007)

Dann schieb deinen Hass mal auf die Seite und konzentrier dich auf das Problem  :roll: 
Du verschluckst hundertprozentig irgendwelche Exceptions.
Ein Applet kann ohne Signierung weder auf das Dateisystem des Clients, noch des Servers zugreifen.
Ebenfalls kann keine Connection zu einem anderem Rechner als dem Host von dem das Applet geladen wurde hergestellt werden. Kannst du diese Fälle schonmal ausschließen?


----------



## Kaladial (12. Nov 2007)

puh:

also da ich ja eine verbindung zu der kamera herstellen und das bild der kamera anzeigen kann funktioniert die socket-komunikation schon mal... 

Java Plug-in 1.6.0_03
Verwendung der JRE-Version 1.6.0_03 Java HotSpot(TM) Client VM
Home-Verzeichnis des Benutzers = C:\Dokumente und Einstellungen\LordTerra
----------------------------------------------------
c:   Konsole löschen
f:   Objekte in Finalisierungswarteschlange finalisieren
g:   Speicherbereinigung
h:   Diese Hilfemeldung anzeigen
l:   ClassLoader-Liste ausgeben
m:   Speicherbelegung anzeigen
o:   Protokollierung auslösen
p:   Proxy-Konfiguration neu laden
q:   Konsole ausblenden
r:   Richtlinien-Konfiguration neu laden
s:   System- und Bereitstellungseigenschaften ausgeben
t:   Threadliste ausgeben
v:   Thread-Stack ausgeben
x:   ClassLoader-Cache löschen
0-5: Trace-Stufe auf <n> setzen
----------------------------------------------------
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at AVS3.APPAnzeigeLiveBild$1.run(APPAnzeigeLiveBild.java:54)


^^ diese ecxeption bekomm ich wenn ich die seite reloade nachdem ich "x:   ClassLoader-Cache löschen" ausgeführt habe



> Ein Applet kann ohne Signierung weder auf das Dateisystem des Clients, noch des Servers zugreifen.



und wie signiere ich ein applet?


----------



## Wildcard (12. Nov 2007)

Kaladial hat gesagt.:
			
		

> > Ein Applet kann ohne Signierung weder auf das Dateisystem des Clients, noch des Servers zugreifen.
> 
> 
> 
> und wie signiere ich ein applet?


Um eins gleich klarzustellen:
Auf das Dateisystem des Hosts kannst du überhaupt nicht zugreifen (ausser über http, ftp,...).
Signieren -> FAQ


----------



## Kaladial (12. Nov 2007)

will nix auf dem host machen... auf dem host soll nur angezeigt werden ...


----------



## Kaladial (12. Nov 2007)

hab jetzt mal n bissel im netz gesucht zum thema signieren... da schreiben sie man soll jar file erstellen aber das will ich ja eigentlich gar nicht... ich hab ja nur class files und es hat ja auch schon mal funktioniert und mir die buttons damit angezeigt aber nur 1 mal von 50 versuchen ... also ich denk immer noch das es an der aktuallisierung liegt aber die mag halt net so wie ich will


----------



## Wildcard (12. Nov 2007)

Als 'Host' bezeichne ich den Rechner auf dem das Applet liegt. Dort willst du sicher nichts anzeigen, oder?


----------



## Kaladial (12. Nov 2007)

echt ? oh ok ich hätte das als server bezeichnet weil da ja eben das applet liegt... 

aber hat sich erledigt ich weis nun warum dieses dumme applet net das gemacht hat was es soll... 

und es lag noch nicht mal am applet selbst ... 
mein kopieren der class files hat nicht funktioniert wenn schon class files da waren ... also der hat die net überschrieben ... naja nu gehts... 

aber die sachen mit classloader waren trotzdem nützlich thx


----------



## Wildcard (12. Nov 2007)

Kaladial hat gesagt.:
			
		

> echt ? oh ok ich hätte das als server bezeichnet weil da ja eben das applet liegt...


Server -> Dienstprogramm
Host -> Hardware auf der Server laufen
Da das Dateisystem auf der physischen Hardware beheimatet ist, wählte ich den Begriff Host.

Naja, hauptsache es tut nun...


----------

