Newsgroup: it.comp.java
Titolo: Piccola Applet Java

Salve,
sono uno studente e da poco tempo sto studiando il linguaggio Java. Ho
scaricato il JDK 1.2.2  ed ho scritto qualche programmino. Ho realizzato un
piccolo programma che apre una finestra dove immetto dei numeri e su tre
Label appaiono il numero di numeri immessi, la media e il numero massimo
immesso. Lanciando il programma compilato da Dos con il comando java, tutto
funziona. Pero' provando ad inserire il programma in una applet dentro una
pagina html, non funziona. Ovvero: il pulsante, il textbox, e le label ci
sono, pero' i dati sulle Label non si aggiornano. Ci sarebbe qualcuno che
sarebbe disposto a dare un'occhiata al piccolo sorgente? Veramente sono
poche righe di codice. Se ho sbagliato newsgroup chiedo scusa.
Grazie.

 ha scritto nel messaggio
news:FDiX8.69247$vm5.2...@news2.tin.it...

Premesso che sono un principiante pure io.
prova a mettere repaint(); dopo l'aggiornamento dei campi.
Oppure posta il codice.
Ciauz

 scaricato il JDK 1.2.2
(cut)
e perché non il jdk 1.4?
posta il codice, sarà un problema di repaint
~~
artemis.alpeia

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
       class provaApp extends Applet {
             private Button ins, azz;
             private TextField testo;
             private Label ris1, ris2, ris3;
             private int contatore;
             private double media;
             private double vettore[];
             private double totale;
             private double numero;
             private int i;
             private double max;
          private class ascolta_ins implements ActionListener {
               public void actionPerformed(ActionEvent e) {
                      contatore=contatore+1;
                      numero=Double.parseDouble(testo.getText());
                      totale=totale+numero;
                      media=totale/contatore;
                      if (contatore==50) {
                         ins.setVisible(false); }
                      vettore[contatore-1]=numero;
                      for (i=0;i<contatore;i++) {
                          if (vettore[i]>max) {
                               max=vettore[i]; } }
                      ris1.setText(String.valueOf(contatore));
                      ris2.setText(String.valueOf(media));
                      ris3.setText(String.valueOf(max));
               }
         }
          private class ascolta_azz implements ActionListener {
                public void actionPerformed(ActionEvent e) {
                      for (i=0;i<50;i++) { vettore[i]=0; }
                      contatore=0;
                      numero=0;
                      totale=0;
                      media=0;
                      max=0;
                      testo.setText("0");
                      ris1.setText("0");
                      ris2.setText("0");
                      ris3.setText("0");
                      ins.setVisible(true);
                }
             }
               public void init()
                   setLayout(new FlowLayout());
                   vettore=new double[50];
                   numero=0;
                   contatore=0;
                   media=0;
                   totale=0;
                   i=0;
                   max=0;
                   ins=new Button("Inserisci");
                   add(ins);
                   ins.addActionListener(new ascolta_ins());
                   testo=new TextField("0",3);
                   add(testo);
                   ris1=new Label("0",Label.RIGHT);
                   ris1.setSize(100,10);
                   add(ris1);
                   ris2=new Label("0",Label.RIGHT);
                   ris2.setSize(100,10);
                   add(ris2);
                   ris3=new Label("0",Label.RIGHT);
                   ris3.setSize(100,10);
                   add(ris3);
                   azz=new Button("Azzera");
                   add(azz);
                   azz.addActionListener(new ascolta_azz());
             }
       }
Pagina html che richiama la Applet:
<html>
<body>
<applet code="provaApp.class" width=500 height=500>
</applet>
</body>
</html>
ins=bottone per immettere nel vettore i numeri scritti nel textbox
azz=bottone per azzerare il textbox, le 3 label e il contenuto del vettore
Caricati 50 numeri nel vettore il bottone inserisci dovrebbe sparire e con
il pulsante azzera dovrebbe ricomparire.
Vi sarei grato se poteste farmi notare eventuali inesattezze di linguaggio o
di concetto. Grazie.

Scusate: questo e' il codice giusto, nel precedente mes. mancava la
parentesi graffa dopo "public void init()".


 parentesi graffa dopo "public void init()".
Complimenti, lei ha trovato un bug nella java virtual machine di internet
explorer!!
Sembra che explorer muoia durante la gestione dell'evento all'esecuzione
della riga
    numero = Double.parseDouble(testo.getText());
Un workaround consiste nell'usare
    numero = Double.valueOf(testo.getText()).doubleValue();
P.S. comunque la parentesi graffa mancava ancora :)
Ciao
~~
artemis.alpeia

 artemis.alpeia
La applet ora funziona, grazie di aver risolto il bug! Ho modificato
l'assegnazione come mi hai suggerito. Non conoscevo questo comando. Se hai
trovato degli errori di linguaggio o di concetto fammelo sapere se puoi (per
esempio sulle classi). Casomai potresti spiegarmi il suggerimento che mi
avete dato all'inizio circa il repaint()?
Ho scaricato il JDK 1.2 alcuni mesi fa, ora puo' darsi che mi scarichero' la
versione 1.4 come mi suggerivi(le novita' mi spaventano un po', data la mia
ignoranza). Per finire, chiedo scusa per i vari errori di post dei messaggi.
Quello di aver sbagliato a non far iniziare il messaggio con "Re:" lo
ammetto. Per quanto riguarda la parentesi graffa, vista l'ora tarda mi sono
detto "avro' sbagliato, riprovo" ho controllato bene che ci fosse la
parentesi graffa ed ho inviato di nuovo, ma con stupore ho notato che di
nuovo non e' stata visualizzata. A quel punto ho lasciato perdere...
Comunque  grazie ancora per la tua gentilezza e disponibilita'.
Ciao

 Ciao
se crei un componente personalizzato, o se disegni su di un Canvas, ecc.
dovrai implementare il metodo
public void paint(Graphics g)
per disegnare ciò che ti pare. Spesso è indispensabile implementare anche il
metodo
public void update(Graphics g)
per disegnare soltanto le parti che sono cambiate (per evitare il
flickering)
Quando prevedi che il componente debba essere ridisegnato, fai una bella
chiamata a repaint(). Nel tuo caso non è necessario perché usi componenti
standard, pensavo dipendesse da questo, e invece... la solita compatibilità
100% non-MS :P
~~
artemis.alpeia

Grazie ancora per la tua gentilezza :)
Ciao