Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [JAVA] Thread e movimento figura

    Salve, a metà giugno ho l'esame di programmazione orientata agli oggetti e sto facendo esercizi per prepararmi ma ho qualche problema su un certo tipo di esercizi

    L'esercizio che sto facendo è una gui dove cliccando su un pulsante vengono creati dei thread che visualizzano una figura che si alza dalla parte bassa del jpanel fino a salire ad una certa altezza e poi si espandono.
    Problemi:
    1) non capisco perché quando clicco sul pulsante non vedo niente, ma se allargo la finestra o la riduco vedo l'animazione. Non riesco a capire perché non si vede solo premendo il pulsante. L'es è quasi identico ad uno del professore (mancano alcune parti ma penso di averle completate correttamente).
    2) come faccio a fare sparire la figura dopo che si è espansa?
    Ecco i codici:
    codice:
    import javax.swing.*;
    import java.awt.event.*;
    import java.util.Random;
    import javax.imageio.stream.*;
    import java.io.*;
    import java.awt.geom.*;
    import java.awt.*;
    import javax.imageio.ImageIO;
    import java.util.*;
    
    class Figura extends Thread{
    	private Color colore;
    	private Color[] colori={Color.white, Color.yellow, Color.red};
    	private double x,y;
    	private double yMax, startX=0.5, startY=0.0;
    	private Random rnd=new Random();
    	private double theta;
    	private int idFigura;
    	private final int NrSPOT=10;
    	private Finestra.PanTracciatura panTraccia;
    	private static int nrFigura=0;
    	private boolean espandi;
    	private boolean eliminato;
    	private int kTime;
    	
    	public Figura(Finestra.PanTracciatura panTraccia){
    		nrFigura++;
    		idFigura=nrFigura-1;
    		colore=colori[rnd.nextInt(colori.length)];
    		this.panTraccia=panTraccia;
    		//yMax tra 0.7 e 0.9
    		yMax=0.7+(0.2*rnd.nextDouble());
    		espandi=false;
    		eliminato=false;
    		//theta casuale tra 80 e 89 oppure 91 e 100
    		boolean temp=rnd.nextBoolean();
    		double deg;
    		if(temp)
    			deg=80.0+(9.0*rnd.nextDouble());
    		else
    			deg=91.0+(9.0*rnd.nextDouble());
    		theta=(Math.PI/180.0)*deg;
    	}
    	public Color getColore(){ return colore; }
    	public double getX(){ return x; }
    	public double getY(){ return y; }
    	public int getIdFigura(){ return idFigura; }
    	public boolean getEspandi(){ return espandi; }
    	public boolean getEliminato(){ return eliminato; }
    	public int getKTime(){ return kTime;}
    	public void run(){
    		double spostamento=yMax/NrSPOT;
    		x=startX;
    		y=startY;
    		while(y<yMax-spostamento){
    			//calcolo nuove coordinate
    			y=y+spostamento;
    			x=startX+(y-startY)/Math.tan(theta);
    			panTraccia.drawFigura();
    			try{
    				sleep(200);
    			}catch(InterruptedException e){}
    		}
    		//finito la salita, si espande
    		espandi=true;
    		for(kTime=1;kTime<20;kTime++){
    			panTraccia.drawFigura();
    			try{
    				sleep(200);
    			}catch(InterruptedException e){}
    		}
    		eliminato=true;
    		panTraccia.drawFigura();			
    	}
    	
    }
    codice:
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    import java.util.Random;
    import javax.imageio.stream.*;
    import java.io.*;
    import java.awt.geom.*;
    import javax.imageio.ImageIO;
    import java.util.*;
    
    class Finestra extends JFrame{
    	protected PanTracciatura panTracciatura;
    	private JButton bFire;
    	private int w,h;
    	public Finestra(int w,int h){
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setTitle(getClass().getName());
    		setSize(w,h);
    		Container cnt=getContentPane();
    		panTracciatura=new PanTracciatura();
    		cnt.add(panTracciatura,BorderLayout.CENTER);
    		bFire=new JButton("Fuoco");
    		bFire.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e){
    				Figura figura=new Figura(panTracciatura);
    				panTracciatura.setFigura(figura);
    				figura.start();
    			}
    		});
    		cnt.add(bFire,BorderLayout.SOUTH);
    		setVisible(true);
    	}
    	class PanTracciatura extends JPanel{
    		private ArrayList<Figura> lsFigura=new ArrayList<Figura>();
    		public void setFigura(Figura figura){
    			lsFigura.add(figura.getIdFigura(), figura);
    		}
    		public PanTracciatura() { setBackground(Color.BLUE); }
    		public void drawFigura(){ paintImmediately(0,0,w,h); }
    		public void paintComponent(Graphics g){
    			super.paintComponent(g);
    			Graphics2D g2=(Graphics2D) g;
    			Dimension dim=getSize();
    			int wSize=dim.width;
    			int hSize=dim.height;
    			if(!lsFigura.isEmpty()){
    				ListIterator<Figura> ite=lsFigura.listIterator();
    				while(ite.hasNext()){
    					Figura figura=ite.next();
    					double xInit=0.0;
    					double yInit=hSize;
    					double y=figura.getY();
    					double x=figura.getX();
    					double xReale=x*wSize;
    					double yReale=y*hSize;
    					AffineTransform at=new AffineTransform();
    					AffineTransform espansione=new AffineTransform();
    					if(!figura.getEspandi()){ //figura non ancora espanda, quindi in movimento
    						at.setToTranslation(xInit+xReale,yInit-yReale);
    					}
    					else{ //figura arrivata all'altezza massima e ora si espande
    						at.setToTranslation(xInit+xReale,yInit-yReale);
    						int kTime=figura.getKTime();
    						espansione.setToScale(0.5*kTime,0.5*kTime);
    						at.concatenate(espansione);
    					}
    					Shape figuraImage=new FiguraImage().getFiguraImage();
    					g2.setTransform(at);
    					Color colore=figura.getColore();
    					g2.setColor(colore);
    					g2.fill(figuraImage);
    				}
    			}
    		}
    	}
    }
    L'altra classe FiguraImage fornisce solo uno shape con il disegno da visualizzare.
    Più una classe col main.

    Grazie a chi mi da una mano

  2. #2
    capito il problema..
    è a causa del
    paintImmediately

    l'ho sostituito con un repaint e ora funziona.

    grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.