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(); } }L'altra classe FiguraImage fornisce solo uno shape con il disegno da visualizzare.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); } } } } }
Più una classe col main.
Grazie a chi mi da una mano

Rispondi quotando