Newsgroup: it.comp.java
Titolo: AIUTO!!!!!!!!! Button, immagini che spariscono e compatibilità Linux-windows

Ho alcuni pulsanti con al centro un'immagine al posto della classica 
scritta. Sono ottenuti definendo una classe foto che estende Button, 
ridefinendone il metodo paint: qui viene caricato un file gif, con il bianco 
impostato come trasparente, di modo che solo la parte nera viene 
visualizzata, coprendo l'aspetto tipico di un Button.
Perfetto! In windows va tutto a meraviglia... perņ, utilizzando Linux 
(esattamente Fedora 3, ma con il java di Sun, versione 1.5.0_01, premendo un 
tasto... scompare l'immagine, e rimane solo il pulsante vuoto!! E man mano 
che vengono premuti gli altri tasti, scompaiono anche le loro immagini!
Allora ho pensato: passiamo il bottone come parametro all'actionPerformed, 
al quale viene ordinato un "bottone.repaint();" per gli ultimi due bottoni 
premuti.
Perfetto! Ora in Linux va tutto a meraviglia, ma...
Tornando in Windows, ora premendo un pulsante lo sfondo diventa 
completamente bianco, con l'immagine nera al centra! Ho perso completamente 
l'aspetto caratteristico di un Button, ovvero il colore grigio sfumato al 
bordo!
Non mi sembra una soluzione quella di dare un 
"g.fillRect(1,1,d.width-1,d.height-1);" nel paint del pulsante, in quanto lo 
sfondo del Button non č solo un rettangolo colorato, ma presenta delle 
sfumature ai bordi, che mi riuscirebbe difficile riprodurre. Inoltre non 
vorrei rischiare una differenza di aspetto tra i pulsanti "normali" e quelli 
con immagine, visto che quello dei primi potrebbe dipenere dalla versione di 
java o del sistema operativo.
AIUTO!!!!!!!!!
//esempio di pulsante con immagine:
    foto esempio=new input.foto("immagine.gif");
    azione azesempio=new azione();
    azesempio.qualetasto(codicepulsante,esempio);
    esempio.addActionListener(azesempio);
//ecc.
//parte della sottoclasse de definisce l'ActionListener:
    class azione implements ActionListener
     {
      private int tasto;
      private foto bottone;
      public void qualetasto(int t,input.foto b)
       {
        tasto=t;
        bottone=b;
       }
      public void actionPerformed (ActionEvent event)
       {
        if (bottone!=null)
         {bottone.repaint();}
        if (bottone_precedente!=null)
         {bottone_precedente.repaint();}
        bottone_precedente=bottone;
        switch (tasto)
//ecc.
//la classe foto:
public class foto extends Button
 {
  Image immagine;
  public foto(String nomefile)
   {
    super();
    InputStream is=getClass().getResourceAsStream(nomefile);
    if (is==null)
     {System.out.println("Il file non esiste o non si riesce a leggerlo.");}
    else
     {
      try
       {
        String dati="";
        while (is.available()>0)
         {
          int dato=is.read();
          dati=dati+(char) dato;
         }
        byte[] buffer=new byte[dati.length()];
        for (int i=0;i<dati.length();i++)
         {buffer[i]=(byte) dati.charAt(i);}
        immagine=this.getToolkit().createImage(buffer);
        is.close();
       }
      catch (IOException e)
       {System.out.println("Il file non esiste o non si riesce a 
leggerlo");}
     }
   }
  public void paint(Graphics g)
   {
    super.paint(g);
    try
     {
      MediaTracker track = new MediaTracker(this);
      track.addImage(immagine,0);
      track.waitForID(0);
     }
    catch(InterruptedException e) {System.out.println("Errore");};
    int imx=immagine.getWidth(this);
    int imy=immagine.getHeight(this);
    Dimension d=this.getSize();
    g.drawImage(immagine,(d.width-imx)/2,(d.height-imy)/2,this);
   }
 }

 grigio sfumato al bordo!
Curioso! Ho scoperto che il colore grigio viene perso solo quando 
l'istruzione java -jar ecc. ecc. è seguita da un'altra istruzione in un file 
batch... in un'applet, o se non seguono altre istruzioni, va tutto bene 
anche in Windows! Mah...


Come non detto... sembra che il problema riguardi la versione 1.2.1 di Java 
di Sun...
Il problema non si presenta quando uso la 1.4.2_07 o la 1.5.0_02, o il java 
di Microsoft per IE6... ma quanti utenti avranno la versione 1.2.1? Ci sarà 
un modo universale di risolvere questo problema?
Sempre in attesa di aiuto.
Marco 

 un modo universale di risolvere questo problema?
Si: "Requisiti minimi: Java 1.4.2, ..."
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

 Si: "Requisiti minimi: Java 1.4.2, ..."
Ma è possibile per l'applet (o applicazione java che sia) "sapere" che 
sistema operativo è in uso, o la versione di java utilizzata? In questo caso 
potrei dare il repaint solo se so di essere in Linux, e non in windows, e 
così funzionerebbe sempre tutto correttamente. 

 così funzionerebbe sempre tutto correttamente. 
Se fosse per me, eviterei che l'applicazione parta se i requisiti minimi
non sono soddisfatti.


Dovrei aver risolto:
...
    if (!System.getProperty("
os.name
" ).startsWith("Windows"))
         {
          if (pulsante!=null)
           {pulsante.repaint();}
          if (pulsante_precedente!=null)
           {pulsante_precedente.repaint();}
         }
...