Newsgroup: it.comp.java
Titolo: Applet per i browser senza plugin









Qualcuno potrebbe dare un occhiata a questo 
codice?


E' un applet ma non vuole funzionare (col Java Plugin funziona ma è troppo 
ingombrante da scaricare). Qualcuno potrebbe darci un occhiata e dirmi cos'è che 
l'explorer non comprende? O se ci sono altri errori?


Graph.class:


import java.awt.*;


import 
java.applet.Applet;


import java.io.*;


 


public class 
Graph 

extends
 
Applet


{ public void init()


{ fn = getParameter("
filename
");


}


 


public void 
paint(Graphics g)


{ Rectangle d = bounds();


g.drawRect(1,1,d.width-1,d.height-1);


g.setColor(Color.white);


g.fillRect(1,1,d.width-1,d.height-1);


Lineare l = new Lineare(fn);


PuntoQ[] punti = l.getPoint(new Punto(d.width, 
d.height));


int[] xP = new int[punti.length];


int[] yP = new int[punti.length];


int[] VolY = new int[punti.length];


for(int cont = 0; cont < punti.length; cont++)


{ xP[cont] = punti[cont].getX();


yP[cont] = punti[cont].getY();


VolY[cont] = punti[cont].getYVol();


}


g.setColor(Color.green);


g.drawPolyline(xP, yP, punti.length);


g.setColor(Color.gray);


int space = (int)punti[punti.length-1].getX();


Giorno[] gg = l.getGiorni();


int v = space/gg.length;


Font f = new Font("Arial", Font.BOLD, 10);


g.setFont(f);


for(int cont = 0; cont < gg.length; cont++)


{ int xd = cont*v;


g.drawString(gg[cont].toString(), 
xd-18+d.width/20,(int)(d.height*0.9)+9);


g.drawLine(xd+d.width/20,d.height/100,xd+d.width/20,(int)(d.height*0.9));


}


double[] YQ = l.getSQuot(15);


int[] YP = new int[15];


for(int c = 0; c < 15; c++)


{ YP[c] = l.getY(new Punto(d.width, d.height), 
YQ[c]);


g.drawString(YQ[c]+"", xP[xP.length-1]+20, 
YP[c]+5);


g.drawLine(d.width/100, YP[c], xP[xP.length-1]+14,YP[c]); 



}


g.setColor(Color.blue);


for(int cont = 0; cont < punti.length; cont++)


{ g.drawLine(xP[cont], YP[0], xP[cont], 
YP[0]-VolY[cont]);


} 


}


String fn;


}


Grafico.class:


import java.io.*;


import java.util.*;


import java.net.URL;


class Grafico


{ public Grafico(Vector quot)


{ qs = quot; 


}


 


public Grafico(String filename)


{ try


{ URL url = new 
URL("
http://localhost/grafici/
"+filename);


StringTokenizer t;


String date;


Giorno day;


try 


{ BufferedReader in = new BufferedReader(new 
InputStreamReader(url.openStream()));


Vector v = getLine(in);


qs = new Vector();


for(int cont = 0; cont < v.size(); cont++)


{ if(!v.get(cont).equals(""))


{ t = new StringTokenizer((String)v.get(cont)," 
");


if(!(date = t.nextToken()).equalsIgnoreCase("data")) 



{ day = new 
Giorno(Integer.parseInt(date.substring(3,5)),


Integer.parseInt(date.substring(0,2)),Integer.parseInt(date.substring(6,10)));


qs.add(new Quotazione(new 
Double(t.nextToken()).doubleValue(),


new Double(t.nextToken()).doubleValue(),new 
Double(t.nextToken()).doubleValue(),


new 
Double(t.nextToken()).doubleValue(),Integer.parseInt(t.nextToken()), day)); 



}


}


} 


qs.trimToSize();


}


catch(IOException e) {}


}


catch(Exception e)


{}


}


 


public double[] getQuotArray()


{ double[] ch = new double[qs.size()];


for(int n = 0; n<ch.length; n++)


{ ch[n] = ((Quotazione)qs.get(n)).getChius();


}


return ch;


} 


 


public int[] getVolArray()


{ int[] vol = new int[qs.size()];


//int[] vol = new int[10];


for(int n = 0; n<vol.length; n++)


{ vol[n] = ((Quotazione)qs.get(n)).getVol();


//vol[n] = 10;


}


return vol;


}


public double getMax()


{ double[] ch = getQuotArray();


double res = 0;


double[] tmp = (double[])ch.clone();


java.util.Arrays.sort(tmp);


return tmp[tmp.length];


}


 


public double getMin()


{ double[] ch = getQuotArray();


double res = 0;


double[] tmp = (double[])ch.clone();


java.util.Arrays.sort(tmp);


return tmp[0];


}


 


public Vector getLine(BufferedReader in)


{ String s;


Vector v = new Vector();


try


{ while ((s=in.readLine()) != null)


{ v.add(s);


}


}


catch(IOException e)


{}


v.trimToSize();


return v;


}


Vector qs;


}


 


Lineare.class:


import java.util.*;


import java.lang.Math.*;


import java.io.*;


import java.text.*;


public class Lineare extends Grafico


{ public Lineare(Vector quot)


{ super(quot);


}


 


public Lineare(String filename)


{ super(filename);


}


 


public double getMax()


{ double res = 0;


double[] tmp = getQuotArray();


java.util.Arrays.sort(tmp);


return tmp[tmp.length-1];


}


 


public PuntoQ[] getPoint(Punto dim)


{ double[] ch = getQuotArray();


int[] vol = getVolArray();


PuntoQ[] res = new PuntoQ[ch.length];


double dimx = dim.getX()*0.85/ch.length;


for(int n = 0; n<ch.length; n++)


{ res[n] = new 
PuntoQ((int)Math.round((n+1)*dimx+dim.getX()/20), getY(dim,ch[n]), getVolY(dim, 
vol[n]));


}


return res;


}


 


public int getY(Punto dim, double q)


{ int y = dim.getY();


int rap = 
(int)Math.round(dim.getY()/getMax()*1.2);


int res = dim.getY()-(int)Math.round(q*rap);


return res+(int)(y/2.6);


}


public int getVolY(Punto dim, int v)


{ int[] order = getVolArray();


java.util.Arrays.sort(order);


int max = order[order.length-1];


int space = dim.getY()/5;


double rap = ((double)space)/((double)max);


return (int)Math.round(v*rap);


}


public double getQuotFromY(Punto dim, int y)


{ int rap = 
(int)Math.round(dim.getY()/getMax()*1.2);


int q = (dim.getY()-y)/rap;


return q;


}


public Giorno[] getGiorni()


{ int h = 7*((int)(qs.size()/10/7))+1;


int r = qs.size()/h;


Giorno[] gg = new Giorno[r];


for(int c = 0; c<r; c++)


{ gg[c] = ((Quotazione)qs.get(c*h)).getDay();


}


return gg;


}


 


public double[] getSQuot(int num)


{ double dif = getMax()-getMin();


double space = dif/(num-6);


double[] res = new double[num];


for(int c = 0; c < num; c++)


{ res[c] = Appross(getMin()+(c-3)*space, "0.##");


}


return res;


}


public double Appross(double s, String decf)


{ DecimalFormat df = new DecimalFormat(decf);


String a = df.format(s);


String res = "";


for(int cont = 0; cont < a.length(); cont++)


{ if (a.charAt(cont) == ',') { res = a.substring(0, 
cont)+"."+a.substring(cont+1, a.length()); }


}


return new Double(res).doubleValue();


}


}



 che l'explorer non comprende? O se ci sono altri errori?
Questo messaggio mi sembra di averlo già visto... quindi passo alla risposta
(scusa se sarò piuttosto diretto):
1) E' difficile verificare cosa succede perché il codice che hai postato non
è completo: mancano delle classi e quindi non è compilabile. Inoltre, dato
che a) non dici neppure cosa fà (anche se in parte lo si intuisce...), b) è
abbastanza intricato, anche perché l'indentatura è andata a farsi benedire,
e c) non contiene nemmeno la più remota traccia di un _commento_, è più il
tempo che ci vuole a leggerlo che il resto.
2) Volendo ottenere aiuto, in futuro eviterei di postare messaggi del tipo:
" 'sto codice non funziona, mettetemelo a posto..." perché è il modo giusto
per_non_ ottenere risposte (come infatti è successo.)
Ti invito quindi a ripostare il quesito descrivendo quale funzione dovrebbe
svolgere il codice, come si presenta il problema e che tentativi hai già
fatto per risolverlo. Inoltre sarebbe gradito un minimo di _commento_
all'interno del codice, in modo che anche chi non l'ha mai visto possa
trovarne il filo in breve tempo (il che, tra le altre cose, dovrebbe tornare
utile anche a te se in futuro dovessi riprendere in mano il sorgente per una
modifica.)
Spero tu non te la prenda, questa vuole essere una critica costruttiva. In
fondo, quando cerchi aiuto su un NG, stai chiedendo ad altri di dedicarti
gratuitamente parte del loro tempo. Credo quindi sia giusto fare uno sforzo
per facilitare le cose a chi è disposto a darti una mano, o no?
Marco.
--
Per scrivermi direttamente elimina
__TOGLIMI__ dall'indirizzo e-mail.





Ammetto che i commenti non ci sono e che quindi è 
difficile venire a capo del codice però io non volevo che voi mi trovaste degli 
errori, anche perchè il codice va bene con il java plug-in. Il mio problema è 
che ho realizzato un'applet per un pubblico piuttosto vasto ed impossibile 
chiedere a tutti di scaricare i 3 mega del plugin. Volevo solo che voi, con 
un'occhiata veloce vedeste se sono presenti riferimenti a librerie, o una 
qualche funzione che nelle applet non è permessa. Ecco perchè non ho allegato 2 
classi, che sono certo non possano costituire degli errori considerata la loro 
semplicità. Se poi ti interessa sapere qual è la funzione dell'applet, io 
l'avevo inserita nel primo messaggio mandato: deve realizzare un grafico lineare 
(per la borsa) più i volumi in basso prelevando i dati da un file presente sulla 
rete(nel suo stesso server naturalmente).


Per quanto riguarda i commenti, io non li utilizzo 
ecco perchè non sono presenti. Non ci sono errori di sintassi o roba varia, 
l'errore è solo di compatibilità tra lo Java 2 che io conosco e la VM utilizzata 
dai browser attuali.







Ho dimenticato di aggiungere che se volete vedere 
l'applet funzionante potete andare qui: 
http://www.ilborsinonline.com/grafici/temp.htm
 , 
naturalmente soltanto con il plugin. Vi chiedo di vedere se si riesce a farla 
funzionare senza di esso sui browser.



...dopo di che mi devi una birra, ok? ;-)
Problemi di compatibilità della tua applet col JDK 1.1:
1) i metodi get() e add() della classe java.util.Vector sono disponibili a
partire dal JDK 1.2, ergo devi utilizzare gli analoghi elementAt() e
addElement() che sono retrocompatibili  (vedi documentazione delle API)
2) la classe java.util.Arrays è disponibile a partire dal JDK 1.2 quindi non
puoi usare java.util.Arrays.sort(). Trova un'alternativa che non si appoggi
sulla classe java.util.Arrays.
Fatte queste modifiche dovrebbe andare come un treno anche senza Plug-in
(ovviamente elimina l'accrocchio generato da HTML Converter dal file HTML, e
già che ci sei, completalo perché a quello che hai messo in linea mancano un
paio di tag chiusura.)
"Take home message": occhio ad usare nelle applet i membri della famiglia
java.util.* perché hanno subito un sacco di modifiche ed aggiunte nel corso
delle versioni, quindi è facile creare codice non retro-compatibile.
Marco.
