Problema nella creazione di un vettore di Oggetti

di il
3 risposte

Problema nella creazione di un vettore di Oggetti

Salve a tutti, premetto che non ho al momento ampie conoscenze con questo linguaggio di programmazione, in quanto lo sto studiando da circa un anno a scuola (frequento il quinto anno di Informatica), e un po' a casa da autodidatta.

Il programma che ho realizzato è basato semplicemente su 3 classi:

-creaOggetti (Main e creazione Oggetti)
-Processo (classe che richiamo all'esecuzione del Thread per avviare il programma )
-Oggetto (classe nella quale disegno l'oggetto, in questo caso ovali e ne definisco le caratteristiche)

In sostanza lo scopo del programma è creare dei cerchi sullo schermo, e farli muovere.
Creando manualmente uno, due, tre o piu' oggetti, il programma funziona benissimo, mi crea gli oggetti e li disegna sullo schermo, ma nel momento in cui rendo "Dinamica" la cosa, creando un vettore di oggetti, essi non compiono sullo schermo, penso sia dovuto al fatto che non riesce a disegnarli ma non so per quale ragione.

Ecco il codice:

Classe Processo (non penso proprio sia qui il problema):

package oggetto;

public class Processo implements Runnable {
	
	creaOggetti Elemento = new creaOggetti();

	
	@Override
	public void run() {
		Elemento.crea();
		while(true){
			try {
                Elemento.movimento();
				Elemento.repaint();
				Thread.sleep(15);
				
			} catch (InterruptedException e) {
				
				e.printStackTrace();
				
			}
		}
		
	}

}

Classe Oggetto:

package oggetto;

import java.awt.Color;
import java.awt.Graphics2D;

public class Oggetto {
	
	int WIDTH, HEIGHT, x = 0, y = 0;
	final int asseX; //Asse X di partenza
	final int asseY; //Asse Y di partenza
	
	//Costruttori
	Color colore=Color.ORANGE;
	public Oggetto ovale;

	public Oggetto(Oggetto cerchio, int x, int y, int WIDTH, int HEIGHT) {
		this.ovale=(cerchio);
		this.x = x;
		this.y = y;
		this.WIDTH = WIDTH;
		this.HEIGHT = HEIGHT;
		asseX=x;
		asseY=y;
	}

	void sposta(int larghezzaFinestra, int altezzaFinestra) {
		
		System.out.print("\nX = "+x+" Y = "+y);
		
		if ( x >= asseX && x < (larghezzaFinestra-(this.WIDTH+asseX)) ) x++; //Larghezza finestra - Coordinata di partenza X = DIAMETRO
		else x = asseX; //X di partenza
		
		if(x>=this.WIDTH && x<=larghezzaFinestra/2) y++;
		else if (y>=((altezzaFinestra/2))) y=asseY;

		
	}

	public void paint(Graphics2D g) {
		g.setColor(this.colore);
		g.fillOval(x, y, WIDTH, HEIGHT);
	}
}
Classe creaOggetti (penso sia nel print l'errore):

package oggetto;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")

public class creaOggetti extends JPanel {
  
   public static int h;
   public static int w;
   final int MAX_OGGETTI=2;

  
   /*
	Oggetto cerchio0=new Oggetto(this.cerchio0,20,50,100,100, Color.RED);
	Oggetto cerchio1=new Oggetto(this.cerchio1,20,200,100,100,Color.ORANGE);
	Oggetto cerchio2=new Oggetto(this.cerchio1,20,350,100,100,Color.GREEN);
    */
   
	
    Oggetto[] cerchio = new Oggetto[MAX_OGGETTI];
	InputStreamReader input = new InputStreamReader(System.in); // Flusso di byte
	BufferedReader tastiera = new BufferedReader(input); // Flusso di caratteri
    
	public void crea(){
		
		 int X=0,Y=0,W=0, H=0;

		for(int i=0; i<MAX_OGGETTI; i++){
			
			try {
				
				System.out.print("Inserisci l'asse X di partenza dell'oggetto -> ");
				X = Integer.parseInt(tastiera.readLine());
				
				System.out.print("Inserisci l'asse Y di partenza dell'oggetto -> ");
				Y=Integer.parseInt(tastiera.readLine());
				
				System.out.print("Inserisci la larghezza dell'oggetto -> ");
				W=Integer.parseInt(tastiera.readLine());
				
				System.out.print("Inserisci l'altezza dell'oggetto -> ");
				H=Integer.parseInt(tastiera.readLine());
				
				cerchio[i]=new Oggetto(cerchio[i],X,Y,W,H);
				
			} catch (NumberFormatException | IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			
			
		}
	}
	
	public void movimento() {
		for(int i=0;i<MAX_OGGETTI; i++) cerchio[i].sposta(h,w);
	}

	  public void paint(Graphics2D g) {
    	
		super.paint(g);
		Graphics2D g2d=(Graphics2D) g;
		for(int i=0;i<MAX_OGGETTI; i++) cerchio[i].paint(g2d);
  }
	
}
	
	
	public static void main(String[] args) throws InterruptedException  {
		
	
		
		JFrame frame= new JFrame("Processo");
		frame.setSize(800, 600);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Rectangle r = frame.getBounds();
		h = r.height;
		w = r.width;
		
		Processo proc0=new Processo();
		Thread p1=new Thread(proc0);
		
		frame.add(proc0.Elemento); //Aggiungo gli oggetti JPanel al FRAME
		frame.setVisible(true);
		
		p1.start(); //Avvio il Thread
	}
}
Spero di poter risolvere al piu' presto, intanto vi ringrazio in anticipo!

Non compaiono gli oggetti sullo schermo !

3 Risposte

  • Re: Problema nella creazione di un vettore di Oggetti

    Al di là del design (molto discutibile) e dei nomi usati (che non sempre rispettano le regole di nomenclatura Java), l'errore sta nel fatto che nella classe "creaOggetti" (i nomi delle classi vanno con la maiuscola!) hai creato un array di oggetti "Oggetto" chiamato "cerchio", in grado di contenere MAX_OGGETTI di tipo "Oggetto", ma non ne hai messo dentro nemmeno uno.

    E' il classico errore che commettono tutti quelli che si avvicinano alla programmazione e si trovano a dover affrontare l'argomento "array".

    Supponiamo di avere una classe "Persona".
    
    Persona[] elenco = new Persona[10];
    
    Questa istruzione istanzia un array in grado di contenere 10 oggetti di tipo "Persona"... ma al momento non ne contiene nemmeno uno. Ci sono 10 posizioni vuote (null). Se voglio "riempire" l'array devo farlo esplicitamente:
    
    // Primo modo
    elenco[0] = new Persona();   // creo un oggetto e lo metto alla posizione 0
    elenco[1] = new Persona();   // creo un oggetto e lo metto alla posizione 1
    ...   // eccetera
    
    // Secondo modo
    for(int i=0; i<10; i++) {
       elenco[i] = new Persona();   // Con un ciclo for riempio l'array
    }
    
    Nella classe "creaOggetti" tu questo non lo hai fatto... hai solo istanziato l'array e successivamente tenti di usarne gli oggetti (che non esistono), scatenando la NullPointerException (quando il thread richiama il metodo movimento() stai provando ad usare l'i-esimo oggetto dell'array che, però, è vuoto...


    Non ho guardato il resto del codice, ti ho solo spiegato il perchè di quell'eccezione.


    Ciao.
  • Re: Problema nella creazione di un vettore di Oggetti

    Ho risolto quel problema, si infatti mi ero dimenticato di creare l'oggetto per ogni elemento, però adesso la finestra appare senza gli oggetti, la X si incrementa e sembra funzionare però non ci sta nulla sul frame, come se non li disegnasse ! Ho aggiornato il codice iniziale
  • Re: Problema nella creazione di un vettore di Oggetti

    Scusa ma ci sono un paio di cose che non mi tornano:

    1.
     public class Processo implements Runnable {
       
       creaOggetti Elemento = new creaOggetti();
    ....
    

    Ma da quel che ho capito creaOggetti è la classe principale (infatti presenta il metodo main per essere richiamata come prima classe, a cosa serve fare una cosa del genere sul runnable che poi istanzi proprio all'interno della main di creaOggetti?

    2.
    public Oggetto(Oggetto cerchio, int x, int y, int WIDTH, int HEIGHT) {
          this.ovale=(cerchio);
    il costruttore come primo parametro riceve un cerchio di tipo Oggetto che poi tu valorizzi con l'istruzione
    cerchio[i]=new Oggetto(cerchio[i],X,Y,W,H);
    .
    Il che mi fa pensare che quando istanzi cerchio come Oggetto, passi al costruttore proprio lo stesso elemento che stai cercando di istanziare e che quindi (se non vado errato) in quel dato momento è ancora null (oltre al fatto che poi dentro la classe non ti servirebbe visto come è fatta).

    Un'altra cosa, come fai a creare le classi creaOggetti e Processo se una istanzia l'altra e viceversa?
    La classe Oggetto a me si compila, ma le altre due no perchè entrambe dichiarano un oggetto al loro interno dipendente dall'altra
Devi accedere o registrarti per scrivere nel forum
3 risposte