Newsgroup: it.comp.java
Titolo: Inserire un immagine di sfondo come "cover" di un Frame

Salve,
ho realizzato unìapplicazione Desktop attraverso le Swing di java.
Vorrei ora fare in modo che il JFrame principale e tutti i suoi
componenti inseriti (JPanel e relativi bottoni) abbiano come sotto
fondo non il "grigio" classsico delle Swing, ma l'immagine ad esempio
di un circuito stampato. Ho provato a campbiare sfondo in tanti modi:
reimplementando il metoto paint; usando le Label + immagini;
ridefinendo il metodo painComponents.. nulla di tutto questo tuttavia
mi ha portato ad avere disegnata l'immagine sullo sfondo come voluto..
Qualcuno mi può aiutare?
Grazie mille,
alessandro

 alessandro
Forse con due layer, tramite un JLayeredPane, il layer sottostante con 
l'immagine, e quello davanti con il tuo JPanel setOpaque(false)
Pero' non ci ho mai provato.
-- 
Dr.Ugo Gagliardelli,Modena,ItalyCertifiedUindoscrasherA�ejoAlcoolInside
Spaccamaroni andate a cagare/Spammers not welcome/Spammers v�o � merda
Spamers iros a la mierda/Spamers allez vous faire foutre/Spammers loop
schijten/Spammers macht Euch vom Acker/Spamerzy wypierdalac'

 alessandro
// Calc.java "layout swing" per calcolatrice con sfondo jpgeg.
// nessuna logica di funzionamento � solo per mostrare il design
// Michelangelo Giacomelli 
michel...@blu.it
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class Calc extends JFrame
{
  JScrollPane scrollPane;
  ImageIcon icon;
  Image image;
  String BackGroundFileName;
  public Calc()
  {
    BackGroundFileName = "gatto.jpg";
    icon = new ImageIcon(BackGroundFileName);
    JPanel panel = new JPanel()
    {
      protected void paintComponent(Graphics g)
      {
        Dimension d = getSize();
        g.drawImage(icon.getImage(), 0, 0, d.width, d.height, null);
        super.paintComponent(g);
      }
    };
    panel.setOpaque( false );
    panel.setPreferredSize( new Dimension(400, 400) );
    scrollPane = new JScrollPane( panel );
    getContentPane().add( scrollPane );
    panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    panel.setLayout(new GridLayout(5, 4, 5, 5));
    String[] buttons =
    {
      "Cls", "Bck", "", "Close", "7", "8", "9", "/", "4",
      "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"
    };
    for (int i = 0; i < buttons.length; i++)
    {
      if (i == 2)
        panel.add(new JLabel(buttons[i]));
      else
        panel.add(new JButton(buttons[i]));
      }
      add(panel);
  }
  public static void main(String [] args)
  {
    Calc frame = new Calc();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 300);
    frame.setLocationRelativeTo( null );
    frame.setVisible(true);
  }
}

 - Mostra testo citato -
Ciao,
ho ridefinito il metodo paintComponent come mi dicevi, di più ho messo
in esso una System.out.println("entro"); di debug, ma purtroppo noto
che in esecuzione Java non chiama mai questo metodo.. Come posso
risolvere? ancora non vedo limmagine come sfondo.
Ti ringrazio in anticipo..

 Ti ringrazio in anticipo..
mostra il codice.

 - Show quoted text -
Scusa il ritardo con cui ti rispondo, davvero..
Uso NetBeans e parte delle sue api. In particolare, la classe del
Frame nel mio codice non estende JFrame delle api di java, bensì la
classe FrameView (che penso faccia parte delle api di NetBean..)
L'import di tale classe è il seguente:
org.jdesktop.application.FrameView..
Il codice è questo:
public class WriteBinaryView extends FrameView {
     JPanel panel = new JPanel()
     {
      protected void paintComponent(Graphics g)
       {
      String  BackGroundFileName = "gatto.jpg";
      ImageIcon icon = new ImageIcon(BackGroundFileName);
      Dimension d = getSize();
      g.drawImage(icon.getImage(), 0, 0, d.width, d.height, null);
      super.paintComponent(g);
      System.out.println("OCCHIO: ENTRO!!");
    }
     };
     panel.setOpaque( false );
     panel.setPreferredSize( new Dimension(400, 400) );
     scrollPane = new JScrollPane( panel );
     getContentPane().add( scrollPane );
      ..
      ..
}
Il fatto che non sia chiamato il paintComponenents() può essere
addebitato al fatto che la classe base non sia JFrame?
Grazie mille in anticipo..
Può darsi

 
giusto per capire se fai il resize che succede?

 
prova con:
getContentPane().add( scrollPane );
revalidate();
repaint();

 // Michelangelo Giacomelli 
michelange...@blu.it

Nel metodo paintComponent (apparte che non ricordo se è protected o
public) effettui prima il g.draw e poi il super.paintComponent(g)
questo è errato perchè quando chiami il super questo ti disegna
"sopra" pertanto inverti g.draw con super.paintComponent.
Ciao!