Newsgroup: it.comp.java
Titolo: [HELP] Impostazione oggetti

Ciao a tutti.
Spiego subito il mio problema:
Ho una classe JVisual con due metodi getList:
-1) uno riceve un Vector e restituisce un List contenente le stringhe
contenute in Vector
-2) uno invece riceve sia il Vector sia il List sul quale copiare le
stringhe
La classe JVisual viene istanziata dall'applet Test che istanzia una
classe List, chiamata lstTest.
Se richiamo getList nel primo modo e quindi
     lstTest=jV.getList(mioV);
l'applet mi visualizza la lista vuota ( in realtà
System.out.println("lstTest " + lstTest.getItemCount()) mi da un numero
)
Se richiamo getList nel secondo modo e quindi
     jV.getDaA(mioV,lstTest);
l'applet mi visualizza la lista piena
Qualcuno sa spiegarmi se il codice è scritto correttamente????
Allego i sorgenti
Ciao a tutti e grazie in anticipo
-------------------------
FILE JVisual.java
-----------------------
import java.awt.*;
import java.util.*;
public class JVisual
{
   public List getList(Vector vctIn){
    List miaList;
    int intRighe;
  int intColonne;
    System.out.println("vctin " + vctIn.size());
    intRighe = vctIn.size();
      String[] str = (String[])vctIn.elementAt(0);
     intColonne = str.length;
      System.out.println("Num. elementi " + intRighe + " " +
intColonne);
      miaList = new List(4,false);
      String strRiga;
      for (int r=0; r < intRighe; r++){
       str = (String[])vctIn.elementAt(r);
       strRiga = "";
       for (int c=0; c < intColonne; c++){
        strRiga += str[c] + "|";
       }
       System.out.println(strRiga);
       miaList.add(strRiga);
      }
      return miaList;
    }
    public void getDaA(Vector vctIn, List miaList){
    int intRighe;
  int intColonne;
    System.out.println("vctin " + vctIn.size());
    intRighe = vctIn.size();
      String[] str = (String[])vctIn.elementAt(0);
     intColonne = str.length;
      System.out.println("Num. elementi " + intRighe + " " +
intColonne);
      System.out.println("Num. lista prima " + miaList.getItemCount());
      String strRiga;
      for (int r=0; r < intRighe; r++){
       str = (String[])vctIn.elementAt(r);
       strRiga = "";
       for (int c=0; c < intColonne; c++){
        strRiga += str[c] + "|";
       }
       System.out.println(strRiga);
       miaList.add(strRiga);
      }
      System.out.println("Num. lista dopo " + miaList.getItemCount());
    }
}
--------------
FILE  Test.java
---------------
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Test extends Applet {
   public void init(){
    setLayout(gb);
  c.gridx=0; //6;
  c.gridy=0;
  c.fill = GridBagConstraints.HORIZONTAL;
  c.anchor = GridBagConstraints.NORTH;
  c.weighty=1;
  gb.setConstraints(butCerca, c);
  add(butCerca);
  //c.gridwidth  = GridBagConstraints.REMAINDER;
  c.gridx=1;
  gb.setConstraints(txtCerca, c);
  add(txtCerca);
  c.gridx=2;
  gb.setConstraints(pDummy, c);
  add(pDummy);
  c.gridx=0;
  c.gridy=1;
  c.weightx=1;
  c.gridwidth  = GridBagConstraints.REMAINDER;
  c.fill = GridBagConstraints.BOTH;
  gb.setConstraints(lstTest, c);
  add(lstTest);
  String[] s = new String[3];
  s[0]="pippo0";
  s[1]="pippo1";
  s[2]="pippo2";
  mioV.addElement(s);
  mioV.addElement(s);
  mioV.addElement(s);
  mioV.addElement(s);
  lstTest=jV.getList(mioV); //Così non mi visualizza niente ???
  //jV.getDaA(mioV,lstTest); //Così funziona
  System.out.println("lstTest " + lstTest.getItemCount());
  repaint();
   }//fine INIT
   private GridBagLayout gb = new GridBagLayout();
 private GridBagConstraints c = new GridBagConstraints();
 private Button   butCerca = new Button("Cerca");
 private TextField  txtCerca = new TextField("cosa",6);
 private List     lstTest = new List(4,false);
 private Panel        pDummy = new Panel();
 private Vector   mioV=new Vector();
 private JVisual  jV=new JVisual();
}//Fine class Test
----------------
FILE TEST.html
-----------------
<HTML>
<HEAD>
<TITLE>test</TITLE>
</HEAD>
<BODY>
<H1>T E S T</H1>
<HR>
<APPLET codebase="." code="Test.class" width=500 height=200>
</APPLET>
<HR>
</BODY>
</HTML>
-------------

 Spiego subito il mio problema:
Il problema sta nel modo in cui gestisci un oggetto "visuale", una
java.awt.List, che è inserita nel panel della applet, e la relativa
rappresentazione dei dati.
Il primo metodo di JVisual (jV.getDaA(mioV,lstTest)), quello che funziona,
riceve un riferimento alla List _originale_ (lstTest) che è già inserita nel
panel della applet con la chiamata add(lstTest) e lo usa per cambiarne il
contenuto (rappresentazione dei dati) in base al riferimento mioV. Quando,
al ritorno, chiami repaint(), la List (che è sempre quella visibile nel
pannello) aggiorna la propria visualizzazione in base al nuovo contenuto e
tutto funziona. Questo è infatti il modo corretto di procedere.
Il secondo metodo di JVisual (lstTest=jV.getList(mioV)), quello che non
funziona, riceve un riferimento ai dati da caricare (mioV) e crea una
_nuova_ List nella quale carica i dati. Poi ritorna un riferimento a questa
nuova List, appena creata e caricata coi dati, e lo assegna al riferimento
lstTest che inizialmente puntava alla List visibile nel pannello della
applet. Nelle tue intenzioni la nuova List ritornata dal metodo getList
dovrebbe sostituire, anche dal punto di vista visuale, quella presente
all'interno del pannello della applet. Il problema è che l'assegnazione del
riferimento non basta per operare lo scambio. Il pannello della applet non
viene informato del cambiamento del riferimento perché, internamente,
mantiene un riferimento alla vecchia List e continua pertanto a farti vedere
quella (che, tra l'altro, non contiene dati e quindi appare vuota.) La
chiamata a getCount() ritorna correttamente 4 semplicemente perché ora il
riferimento punta alla nuova lista, ma _non_ è quella visualizzata! Il modo
di procedere che hai adottato nel secondo caso è errato.
Per operare correttamente la sostituzione dovresti rimuovere dal panel il
riferimento alla vecchia List (col metodo remove) e  quindi aggiungere
quello alla nuova List, ritornata dal metodo getList di JVisual (chiamando
add).
Spero di essere riuscito a chiarirti le idee. L'errore era piuttosto
"subdolo",
hai fatto bene a postare il codice.
Marco.
--
Per scrivermi direttamente elimina
__TOGLIMI__ dall'indirizzo e-mail.

Denghiů mille.
E' un modo un pň strano, a mio parere, di funzionare.
Perň ne prendo atto e obbedisco.....;-)
Ci@o