Newsgroup: it.comp.java
Titolo: Problema array e visibilità oggetto

Ancora un paio di quesiti:
1)E' possibile dichiarare un array a livello globale nella classe B 
utilizzando per il suo dimensionamento un parametro inviato da un classe A?
2)Questione logica
Ho costruito una classe jframe che all'interno del suo costruttore, tra 
le altre cose, crea un array bidimensionale di nome mainBoard e ci 
compie varie operazioni; nella stessa classe c'è un bottone al quale 
vorrei permettere di modificare quel preciso array: come devo dichiarare 
le variabili per assicurarmi visibilità? Non sono riuscito a risolvere...
Ecco una struttura del codice:
     public GraphBoard(int s){
         initComponents();
         int[][] mainBoard = new int[s][s];
	.
	.
	.	
	.
	}
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 		{
         jTextArea1.setText(text);
	//QUI HO BISOGNO DI RICHIAMARE mainBoard, ma non vede l'oggetto!
     	}
Grazie,
/Luke

luc ha scritto:

Ciao Luc,
ti spiego il meccanismo di visibilità e vita delle variabili:
classe luc
   int a;
   public void metodo1()
   {
      int b;
      {
          int c;
          //qui vedo a, b e c
      }
      //qui vedo a e b, ma non c che ha cessato di esistere (perché è
stata dichiarata nelle parentesi graffe)
   }
   public void metodo2()
   {
      //qui vedo solo a, non vedo b perchè è stata dichiarata in un
altro metodo;
   }
}
In pratica le parentesi graffe determinano la visibilità e la vita
delle variabili.
Hai capito il tuo errore?
Devi dichiarare la variabile all'interno della classe e assegnare il
valore all'interno di GraphBoard.
class GraphBoard
      private int[][] mainboard;
      public GraphBoard(int s){
          initComponents();
          mainboard = new int[s][s];
 	.
 	.
 	.
 	.
	}
     private void jButton1ActionPerformed(java.awt.event.ActionEvent
evt) 		{
          jTextArea1.setText(text);
      // Quì la variabile è visibile.
      	}
Ciao
Ps
Sbagliare le maiuscole è un errore sottovalutato.
Le classi iniziano con la maiuscola e sono a gobbeDiCammello.
I metodi iniziano con la minuscola e sono a gobbeDiCammello.
Le variabili devono essere categoricamente minuscole.
I package sono minuscoli.

 
Ciao, grazie per l'aiuto, allora ho sistemato il codice seguendo 
l'esempio da te indicato, e funziona, io credevo che non fosse corretto 
perchè non si procedeva all'inizializzazione dell'array mainboard al 
momento della dichiarazione, ma mi sbagliavo evidentemente.
Ora però si aggiunge un problema, perchè se inserisco ad esempio 
mainboord.length dove mi hai indicato la variabie è effettivamente 
visibile,ma ottengo questo errore:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
Se ho ben capito dalle mie ricerche, dipende dal fatto che l'oggetto 
mainboard risulta non inizializzato, eppure è stato inizializzato a 
dimensioni s nel costruttore GraphBoard...
Io pensavo funzionasse così:
1) chiamo il costruttore GraphBoard(int)
2) è un jframe, quindi costruisce il frame e crea (ed inizializza) 
alcune variabili tra cui mainboard ed essendo l'oggetto mainboard 
dichiarato a livello globale è visibile a tutti i metodi della classe
3) manipolo/modifico il contenuto di mainboard (sempre nel costruttore)
4) premo un pulsante sul mio frame (quindi invoco il relativo metodo 
della classe) perchè voglio fare altre operazioni su mainboard (ad 
esempio stamparlo, o ottenerne la dimensione, o quello che è...)
5) ricevo l'ecceziono NullPointer, quindi mainboard esiste ma è una 
copia? non esiste? non è lo stesso modificato nel costruttore?
Sono confuso...
grazie,
/Luke

luc ha scritto:

Ciao Luc,
a mio avviso hai commesso qualche errore con le maiuscole.
Se vuoi posta il pezzo incriminato spurgato delle cose che non
c'entrano, gli do volentieri un'occhiata.
Ciao.


Ecco il codice:
import java.util.*;
import java.lang.Object;
public class GraphBoard extends javax.swing.JFrame {
 
    private int[][] mainboard;
    private int[][] neightable;
    private String text = "";
 
 
    public GraphBoard(int s){
        initComponents();
        int[][] mainboard = new int[s][s];
        Random r = new Random();
 
 
        //Randomization of the table
        for(int i=0; i<mainboard.length;i++)
        {
            for(int j=0;j<mainboard.length;j++)
            {
                mainboard[i][j] = r.nextInt(2);
            }
        }
 
        // toString of the starting table
        for(int i=0; i<mainboard.length;i++)
        {
            for(int j=0;j<mainboard.length;j++)
            {
              text = text + String.valueOf(mainboard[i][j]) + " ";
            }
          text = text+"\n";
        }
 
        jTextArea1.setText(text);
    }
 
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
 
        System.out.println("Calculation of the new popoluation....");
 
        calculateNeigh();
 
        jTextArea1.setText("update.");
    }
 
    public void calculateNeigh()
    {
        int numneigh = 0;
        for(int i=0; i<mainboard.length;i++)
        {
            for(int j=0;j<mainboard.length;j++)
            {
                //North
                if(((i-1)>=0) && (mainboard[i-1][j]==1))
                    numneigh++;
                //North West
                if(((i-1)>=0) && ((j-1)<mainboard.length) && (mainboard[i-1][j]==1))
                    numneigh++;
 
                neightable[i][j] = numneigh;
            }
        }
        System.out.println("Num neighbours: "+numneigh);
        numneigh = 0;
 
    }
Grazie per l'aiuto, e se puoi chiarirmi anche se i passaggi da me indicati
nel post precedente su come dovrebbe funzionare il programma siano corretti
o no, mi faresti un immenso piacere.
Saluti,
/L.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Ciao Luc,
l'errore che vedo per primo è che usi la variabile jtextarea1 ma non
è definita all'interno di questa classe (come forse è giusto) ma non
è neanche passata a nessun metodo o costruttore, il secondo errore è
che devi importare swing in ogni classe che deve trattare i suoi
oggetti (anche se li instanzi da un'altra parte). Poi l'errore che mi
hai chiesto di trovare è qui:
    public GraphBoard(int s){
        //initComponents();
        int [][] mainboard = new int[s][s];
in questo modo crei un'altro array all'interno del metodo, ma non è la
stesso della classe.
Ti basta togliere int[][] e hai risolto.
Altra cosa, non te ne potevi accorgere perché ti fermavi prima, ma non
hai inizializzato neightable.
Io uso ancora un'applicazione che si chiama BlueJ che è molto comoda
per imparare java o risolvere problemi tipo questo, se la tua
applicazione non è enorme ti consiglio di scaricarlo:
http://www.bluej.org/download/download.html
.
Ciao.