Newsgroup: it.comp.java
Titolo: Choice fa le bizze

In una applet ho un elenco di opzioni che viene inizializzato in un
controllo Choice nella parte init().
Ho bisogno di aggiungere altre voci in fase di runtime, nella parte paint(),
ed il controllo mostra le voci aggiunte ripetendole addirittura sette, otto
volte e anche di più.
Ho fatto diverse prove, copiando anche codici già pronti da Internet, e mi
si ripresenta sempre lo stesso problema.
Qualcuno sa dirmi come mai?.
Grazie
Franco Martinelli


Ciao Franco, se possibile potresti postare lo spezzone di codice che ti 
causa il problema?

 ha scritto nel messaggio
news:4c475081$0$40279$4faf...@reader2.news.tin.it...

Questo è il codice, ridotto all'essenziale;  mandato in esecuzione mostra lo
strano comportamento del controllo
Le parti indicate con le frecce sono quelle relative all'uso del controllo
Grazie per la disponibilità
import java.applet.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
/*
<applet code="eclisseDemoSole" width=750 height=400>
</applet>
*/
public class eclisseSoleDemo extends Applet implements ActionListener
{
    double Long=10.245;
    double Lat=43.85;
    double Quota=0;
    double fuso=+2.0;
    double cf=(fuso-Long)*4/60;
    int dx,dy,XC,YC;
    int Anno,ne,nl,Quante_ecl;
    double AnDec,k,T,T2,T3,T4,JD,F;
    double M,M1,E,Om,F1,A1,I,Fr,JDi,T0,P,Q,W,Gamma,u,Magn;
    String D1="";
    String D2="";
    String D3="";
    String Tipo="";
    String Eclissi_anno_descr[]=new String[20];     //<--------------
    String Eclissi_anno_giorno[]=new String[10];    //<--------------
    Label et1=new Label("Anno");
    Label et5=new Label("Eclissi nell'anno");
    TextField tAnno=new TextField(5);
    Button b1=new Button("Calcola");
    Choice elencoEclissi= new Choice();    //<--------------
public void init()
    {
        elencoEclissi.addItem("Eclissi nell'anno");    //<--------------
        add(et1);
        add(tAnno);
        add(b1);
        add(et5);
        add(elencoEclissi);    //<--------------
        b1.addActionListener(this);
        b1.setActionCommand("calcola");
        Anno=clMeeus2.autoAnno();
        tAnno.setText(Integer.toString(Anno));
}
 //pressione tasto calcola
        public void actionPerformed (ActionEvent e)
        {
            String cmd=e.getActionCommand();
            if (cmd.compareTo("calcola")==0)
            {
                Toolkit.getDefaultToolkit().beep();
                String tx=tAnno.getText();
                Anno=Integer.parseInt(tx);
                repaint();
            }
        }
    public void paint(Graphics g)
    {
     dy=getSize().height-1;  //dimensioni dell'applet
     dx=getSize().width-1;
     XC=(int)(dx/2); YC=(int)(dy/2);
     int riga=30;
     int col=220;
     g.setColor(Color.black);
     g.drawRect(0,0,dx,dy);
     g.drawRect(0,0,dx,32);
//Calola eclissi nell'anno
     AnDec=Anno; //Data in formato numerico decimale - Inizio anno
     k=Math.floor((AnDec-2000)*12.3685);
     k=k-1;    //indietro di una lunazione per inizio anno sicuro
     ne=1;
     for (nl=1;nl<15;nl++) {    //14 lunazioni per essere sicuri fine anno
         k=k+1;
         T=k/1236.85;
         T2=T*T;
         T3=T2*T;
         T4=T3*T;
JD=2451550.09766+29.530588861*k+0.00015437*T2-0.00000015*T3+0.00000000073*T4
;
F=clMeeus2.rad(clMeeus2.angGiro(160.7108+390.67050284*k-0.0016118*T2-0.00000
227*T3+0.000000011*T4));
         if (Math.abs(Math.sin(F))<0.37) {   //c'è eclisse
M=clMeeus2.rad(clMeeus2.angGiro(2.5534+29.10535670*k-0.0000014*T2-0.00000011
*T3));
M1=clMeeus2.rad(clMeeus2.angGiro(201.5643+385.81693528*k+0.0107582*T2+0.0000
1238*T3-0.000000058*T4));
Om=clMeeus2.rad(clMeeus2.angGiro(124.7746-1.56375588*k+0.0020672*T2+0.000002
15*T3+0.000000011*T4));
            E=1-0.002516*T-0.0000074*T2;
            F1=clMeeus2.rad(clMeeus2.gradi(F)-0.02665*Math.sin(Om));
            A1=clMeeus2.rad(299.77+0.107408*k-0.009173*T2);
JD=JD-0.4075*Math.sin(M1)+0.1721*E*Math.sin(M)+0.0161*Math.sin(2*M1)-0.0097*
Math.sin(2*F1);
JD=JD+0.0073*E*Math.sin(M1-M)-0.0050*E*Math.sin(M1+M)-0.0023*Math.sin(M1-2*F
1)+0.0021*E*Math.sin(2*M);
JD=JD+0.0012*Math.sin(M1+2*F1)+0.0006*E*Math.sin(2*M1+M)-0.0004*Math.sin(3*M
1)-0.0003*E*Math.sin(M+2*F1);
JD=JD+0.0003*Math.sin(A1)-0.0002*E*Math.sin(M-2*F1)-0.0002*E*Math.sin(2*M1-M
)-0.0002*Math.sin(Om);
            Eclissi_anno_giorno[ne]=clMeeus2.daJulaGiorno(JD);
//<--------------
//JD istante dell'eclisse massima ridotta all'ora intera più prossima}
            I=clMeeus2.tronca(JD);
            Fr=clMeeus2.frac(JD);
            Fr=Math.round(Fr*24)/24;
            JDi=I+Fr;
P=0.2070*E*Math.sin(M)+0.0024*E*Math.sin(2*M)-0.0392*Math.sin(M1)+0.0116*Mat
h.sin(2*M1);
P=P-0.0073*E*Math.sin(M1+M)+0.0067*E*Math.sin(M1-M)+0.0118*Math.sin(2*F1);
Q=5.2207-0.0048*E*Math.cos(M)+0.0020*E*Math.cos(2*M)-0.3299*Math.cos(M1);
            Q=Q-0.0060*E*Math.cos(M1+M)+0.0041*E*Math.cos(M1-M);
            W=Math.abs(Math.cos(F1));
            Gamma=(P*Math.cos(F1)+Q*Math.sin(F1))*(1-0.0048*W);
u=0.0059+0.0046*E*Math.cos(M)-0.0182*Math.cos(M1)+0.0004*Math.cos(2*M1)-0.00
05*Math.cos(M+M1);
            Magn=(1.5433+u-(Math.abs(Gamma)))/(0.5461+2*u);
//Tipo eclisse
            D1=""; D2=""; D3="";
            if (Math.abs(Gamma)<1.5433+u) { //c'è eclisse
                if (Math.abs(Gamma)<0.9972) {D1=" centrale";}
                if ((Math.abs(Gamma)>=0.9972) && (Math.abs(Gamma)<1.0260))
{D1=" non centrale";}
                if ((Math.abs(Gamma)>=1.0260) && (Math.abs(Gamma)<1.5433+u))
{D1=" parziale";}
                if (u<0) {D2=" totale";}
                if ((u>=0) && (u<0.0047)) {
                    Om=0.00464*Math.sqrt(1-(Gamma*Gamma));
                    if (u>=Om) {D2=" anulare";}
                    if (u<Om) {D2=" anulare-totale";}
                }
                if (u>=0.0047) {D2=" anulare";}
                if (Gamma>0) {D3=" vis.Emisf.Nord";} else {D3="
vis.Emisf.Sud";}
                Tipo=D1+D2+D3;
                Eclissi_anno_descr[ne]=Eclissi_anno_giorno[ne]+Tipo;
//<--------------
                ne=ne+1;
           } //fine c'è eclisse
       } //if sinF
     } //for nl
     g.drawString(""+ne,100,100);
//scrive direttamente sull'applet
     for (int n=1;n<ne;n++) {
        g.drawString(Eclissi_anno_descr[n],50,100+n*15);
     }
//riempie il controllo Choice
     for (int n=1;n<ne;n++) {
          elencoEclissi.add(Eclissi_anno_descr[n]);    //<--------------
        };
   }  //paint
}   //applet

           elencoEclissi.add(Eclissi_anno_descr[n]);    //<--------------
ma scusa il metodo paint non è thread safe inoltre te usi un add.
Svuotalo ogni volta lo choiche e riempilo da capo.
elencoEclissi.removeAll();
for (int n=1;n<ne;n++)
{
    elencoEclissi.add(Eclissi_anno_descr[n]);
};
quando posti del codice così lungo è una carineria renderlo compilabile.
// Anno=clMeeus2.autoAnno(); ??? what is? credo una tua classe..
vedi se funziona con il removeall ciao

     }  //paint
paint viene chiamata tutte le volte che c'è da ridisegnare il contenuto 
dell'applet, evento che viene scatenato secondo necessità tutte le volte 
che serve a discrezione del sistema. Se tu ad ogni giro accodi elementi 
alla tua Choice questi si accumulano.
Soluzione sporca (non conoscendo il tuo codice): svuota la choice prima 
del for
Soluzione ottimale: in paint fai una marea di calcoli. Dovresti 
farglieli fare in una routine a parte che poi memorizza i risultati in 
variabili di istanza. In paint usi quei risultati per disegnare 
l'interfaccia. La routine di calcolo la richiami in init e poi 
successivamente solo se effettivamente è cambiato qualcosa che lo 
giustifica.
-- 
r--r--r--

 ha scritto nel messaggio
news:LPT1o.215056$813.1...@tornado.fastwebnet.it...

Grazie a tutti dei suggerimenti. Per la compilabilità del codice, è vero, mi
sono lasciato prendere dalla fretta e chiedo scusa.
F.M.