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