PDA

View Full Version : Info varie su java: sfondo trasparente, testo colorato


asdf
11-12-2002, 18:26
Usando AWT:

1) c'e' un modo per fare schermate trasparenti?
Ho tolto tutti i bordi col comando setUnancorated, e volevo dare forme strane, tipo ellissi, alla finestra della mia applicazione (usando la paint()).

2) Come faccio a creare testo colorato (so renderlo grassetto, cambiare il font, ecc., ma proprio ignoro come colorarlo)

Grazie

cn73
11-12-2002, 19:27
1) Interessante...ma intendi trasparenti nel senso che devono vedersi le finestre che ci sono sotto??

2)Devi usare il metodo setForeColor(Color c) del contenitore del testo...ad es una label...

PGI
11-12-2002, 20:54
Se usi componenti swing (tipo JLabel) puoi usare l'html per generare Stringhe composite.
Ad esempio:

String testo="<html><font color=red>Ciao</font>a tutti</html>"
JLabel label=new JLabel(test)

genera un'etichetta con la scritta "Ciao" in rosso e "a tutti" in nero. Altri tag generano combinazioni differenti.

Per quanto riguarda le finestre trasparenti è una settimana che "ci sbatto la capoccia" sopra. Il problema non è tanto la finestra in sè quanto lo spostamento della stessa.
Le finestre Java non possono avere (al momento) un colore di sfondo trasparente.
La cosa si aggira facilmente impostando come sfondo una porzione di immagine tratta dallo schermo (metodo createScreenCapture(Rectangle bounds) della classe java.awt.Robot).

Il seguente esempio carica un'immagine GIF a sfondo trasparente e in background un "capture" dello schermo".


import javax.swing.*;
import java.awt.*;
import java.awt.Robot;
import java.awt.image.*;

public class TransparentWindow extends JWindow {
Image image=null;
Image bgImage=null;
Robot robot=null;
BufferedImage buffBg;
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();

public TransparentWindow() {
ImageIcon img=new ImageIcon("c:\\image.gif");
image=img.getImage();
Dimension imgDim=new Dimension(image.getWidth(this),image.getHeight(this));
this.setSize(imgDim);
this.setLocation((int)screenSize.width/2-
this.getWidth()/2,
(int)screenSize.height/2-
this.getHeight()/2);
try {
robot=new Robot();
buffBg=robot.createScreenCapture(this.getBounds());
bgImage=buffBg;
} catch(AWTException e) {
System.out.println(e);
System.exit(1);
}
this.show();
}
public void paint(Graphics g) {
g.drawImage(bgImage,0,0,this);
g.drawImage(image,0,0,this);
}
public static void main(String[] args) {
new TransparentWindow();
}
}


Il problema nasce quando si vuole spostare la finestra: la classe JWindow non supporta la bufferizzazione multipla (come invece i JFrame e gli altri componenti) ed effettua la chiamata al metodo repaint() esclusivamente al momento della visualizzazione: in pratica per eseguire l'update dell'immagine sullo sfondo occorre chiamare il metodo hide(), ricatturare una porzione di schermo, assegnarla al background e chiamare il metodo show(). Oltre a questo ci sono altre stranezze su cui mi sto arrovellando (ad esempio la finestra si "rifiuta" di attendere che un thread esterno carichi l'immagine in background prima di "mostrarsi", ho provato la sincronizzazione, i metodi invokeAndWait(), un ciclo while, ad utilizzare sottocomponenti (JLabel, Canvas, JPanel) per incapsulare l'immagine), ma "mepossinammazzamme" se rinuncio! :D

Ciao.

cn73
14-12-2002, 18:10
PGI mi stavo interessando anche io al problema di realizzare interfacce un po' + complesse e carine dal punto di vista pratico...Ricordi il "nostro" progetto di un Java Media Player di cui dovevi realizzare il motore sonoro e io l'interfaccia?? :D Stay Tuned ;)

Cmq interessante la presentza neli JFrame del GlassPane, un "vetro" trasparente sul ContentPanesu cui puoi utiliìzzare i metodi paint() della classe Graphics e Graphics2D...

cn73
17-12-2002, 14:15
PGI?? :)

PGI
17-12-2002, 19:12
A rapporto!

La realizzazione del motore di un lettore audio non dovrebbe causare problemi, ma bisognerebbe dare un occhiata alla licenza di distribuzione delle classi MPEGPlayer & parenti che non sono sviluppate da Sun.

Ciao.