Newsgroup: it.comp.java
Titolo: immagini e bottoni..

ciao..
Esiste la possibilità di mettere un bottone sopra un immagine ????

> Esiste la possibilità di mettere un bottone sopra un immagine ????
Chi te lo vieta?
TUTTI gli oggetti che derivano da Component, JComponete e Canvas, hanno la
possibilità di (ridefinendoli) di inserire immagini su se stessi.
Nel tuo caso devi però ridefinire gli oggetti che estendono i Container (che
estende a sua volta un Component). Solo i Container (che è una classe
astratta) possono contenere altri oggetti.
Chi sono i Container? Le implementazioni dei Container sono: JPanel, Panel,
Frame, etc.
Come si fa?
Allora tra gli oggetti AWT e SWING ci sono alcune piccole differenze, ma
come logica è quasi identica.
Facciamo un discorso in generale poi lo puoi specializzare per quello che ti
pare.
es:
    // Estendi un Component/Jcomponent.
    Import java.awt.*;
    Import javax.swing.*;
    public class ImagePanel extends Panel        // Panel = AWT,      JPanel
= SWING
    {
        // Dichiari la tua immagine e inserisci i metodi per aggiornarla
etc.
        // Dichiari l'immagine null, in moda tale che se non imposti
l'immagine di sfondo
        // il tuo pannello si comporta in maniera normale.
        Image img = null;
        // Metodi per la gestione
        public void setImage(Image img)
        {
            this.img = img;
            if(img == null) return;
            // Il MediaTracker serve a caricare le immagini.
            // Le immagini vengono caricate in maniera asincrona
            // quindi se non hai un sistema che si assicura che l'immagine
sia correttamente
            // caricata, potresti trovarti (anzi sicuramente), nel caso in
cui a video non vedi nulla
            // fino a che magari non iconizzi e riapri l'applicazione.
            MediaTracker mt = new MediaTracker(this);
            mt.add(img);
            try{
                mt.waitForAll();
            }catch(InterruptedException ex){}
            repaint();
        }
        // Il metodo update si occupa di svuotare durante la fase di
ridisegno (repaint())
        // il contenuto dei component, per poi richiamare paint e farlo
ridisegnare.
        // Questo comporterebbe dei brutti flash a video.
        // Ridifinendo il metodo e lasciando solo il paint, il problema
scompare.
        // N.B. con SWING questo non serve perchè i componenti SWING hanno
un
        // sistema di DoubleBuffering che evita questi flash (anche se non
completamente)
        public void update(Graphics g)
        {
            paint(g);
        }
        // Ora ci occupiamo di ridisegnare il componente e quindi l'immagine
        // Qui sta la differenza principale :
        // Se usi AWT :
        public void paint(Graphics g)
        // Se usi SWING
        protected void paintComponent(Graphics g)
        // Vediamo il blocco dei due metodi
        {
            // La prima cosa da fare è richiamare il metodo della super
classe
            //AWT      : -> super.paint(g);
            //SWING  :->  super.paintComponent(g);
            // dopo di che se l'immagine è impostata:
            if(img != null)
                // La disegno
                g.drawImage(img,0,0,getSize().width, getSize().height);
        }
    }
Ok?
Ciao...........

Come si fa?
Ammettendo di poter usare Swing, avrei fatto una cosa del genere (se ho 
interpretato correttamente la domanda iniziale) :-)
import javax.swing.*;
public class Sfondo extends JLabel {
  public Sfondo(Icon icon) {
    super(icon);
    this.setLayout(null);
    JButton b = new JButton("Prova");
    b.setOpaque(false);
    b.setSize(200, 100);
    b.setLocation(300, 150);
    this.add(b);
  }
 
  public static void main(String[] args) {
    ImageIcon image = new ImageIcon("background.jpg");
    JFrame frame = new JFrame("Prova");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new Sfondo(image));
    frame.pack();
    frame.setVisible(true);
  }
}
Qualcuno ci vede delle controindicazioni (a parte il fatto di usare 
Swing)?
HTH
-- 
Ciao
	Fabrizio C.

In effetti è una soluzione che non ho mai considerato (purtroppo).
Penso che sia altrettanto valida.
Ciao.......

 ha scritto nel messaggio
news:ad060c$5m0g$1...@stargate1.inet.it...
