codice:
package medium;
/**
* Visualizza delle immagini in sequenza, spostandole lungo l'asse x e y equando
* ogni immagine, mediante un Thread, arriva all'ultima posizione passa l'immagine al bottone tramite
* gli observer
*/
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.imageio.*;
import java.io.*;
import java.util.Observable;
import java.util.Observer;
@SuppressWarnings("serial")
class PannelloO extends JPanel implements Observer{
public Osservabile obser;
private JButton j;
Image correnteImg;
Image retro;
int x=0;
int y=50;
public PannelloO(){
super();
j=new JButton();
j.setIcon(new ImageIcon("carte/retro.jpg"));
j.setBorderPainted(false);
j.setBounds(800, 800, 0, 0);
j.setContentAreaFilled(false);
j.setEnabled(true);
this.add(j);
setBackground(Color.green);
this.setBorder(new EtchedBorder());
}
public void disegna(Image im,int i){
correnteImg=im;
repaint();
}
public void paint(Graphics g){
super.paint(g);
g.drawImage(correnteImg,x,y,this);
x=x+20;
y=y+10;
}
public void reset(){x=20;y=20;}
@Override
public void update(Observable o, Object arg1) {
obser=(Osservabile)o;
Image g=obser.getImage();
ImageIcon ic=new ImageIcon(g);
j.setIcon(ic);
}
}
@SuppressWarnings("serial")
public class Sequenza extends JFrame{
PannelloO p;
Osservabile model;
Image []im=new Image[41];
Image retro;
JPanel south=null;
JButton start=null;
boolean inProgress=false;
public Sequenza(){
super("Sequenza Foto");
getContentPane().setLayout(new BorderLayout());
p= new PannelloO();
try{
retro = ImageIO.read(new File("carte/retro.jpg"));
}catch(Exception e){System.out.println(e);}
model=new Osservabile(retro);
model.addObserver(p);
p.update(model, null);
for (int i=1;i<=im.length;i++ ) {
try{
im[i] = ImageIO.read(new File("carte/b"+i+".jpg"));
}catch(Exception e){System.out.println(e);}
}
start=new JButton("start");
start.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
start();
}
});
south=new JPanel();
south.add(start);
add(p,BorderLayout.CENTER);
add(south,BorderLayout.SOUTH);
setSize(550,400);
setLocation(200,200);
setVisible(true);
}
public void start(){
if(inProgress)
return;
inProgress=true;
Thread runner=new Thread() {
public void run(){
Image g=null;
for (int j=1;j<=im.length;j++){
g=im[j];
int i=1;
p.reset();
while (i<=40){
if(i==40){
model.setImage(g);
}
p.disegna(g,i);
i++;
try {
sleep(50);
} catch (Exception ex) {}
}
inProgress=false;
}
}
};
runner.start();//deve lasciare libero il thread che richiama paint...
}
public static void main(String[] args) {
Sequenza s = new Sequenza();
s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
package medium;
import java.awt.Image;
import java.util.Observable;
/**
* Classe Observable
*
*
*/
public class Osservabile extends Observable {
Image i;
public Osservabile(Image i){
this.i=i;
}
public synchronized Image getImage(){return i;}
public synchronized void setImage(Image g) {
i=g;
setChanged();
notifyObservers();
}
}
ho risolto il problema utilizzando Observer e observable. Ogni volta che l'immagine arriva alla fine dell'escursione tramite thread viene mandata attraverso gli osservatori ad un bottone .Solo che il bottone non riesco ad inserirlo dove voglio io nel Pannello0.come faccio ad inserire un bottone dentro un pannello nella posizione che voglio io? se uso setLayout(null); in Pannello0 non mi fa vedere il bottone. Avete qualche suggerimento?