Newsgroup: it.comp.java
Titolo: Sfarfallio Canvas & Buffer Strategy

Salve a tutti, stavo provando a fare un banner con un rollover (si
dice così, vero?). Senza perdermi in chiacchere ecco il codice:
    private class Banner extends Canvas{
        private BufferedImage backbuffer;
        private Graphics2D backgraph;
 
        //private BufferStrategy strategy;
 
        private String displayMsg;
        private int xPos = 10;
        private int width=0, height=0;
 
        public Banner(String msg, int width, int height){
            this.width = width;
            this.height = height;
            setSize(width, height);
            setBannerMessage(msg);
 
            //createBufferStrategy(2);
            //strategy = getBufferStrategy();
 
 
            backbuffer = new BufferedImage(width, 200,
BufferedImage.TYPE_INT_RGB);
            backgraph = backbuffer.createGraphics();
            backgraph.setBackground(Color.black);
            backgraph.setFont(new Font("BANNERFONT", Font.ITALIC,
20));
        }
 
        public void setBannerMessage(String msg){
            this.displayMsg = msg;
        }
 
        public void move(int how){
            if((xPos - how)<0)
                xPos = width;
            xPos -= how;
            repaint();
        }
 
        public void paint(Graphics g){
            Graphics2D g2 = (Graphics2D) g;
 
            backgraph.setColor(Color.black);
            backgraph.fillRect(0, 0, width, height);
            backgraph.setColor(Color.pink);
            backgraph.drawString(displayMsg, xPos, 25);
            g2.drawImage(backbuffer, null, 0, 0);
        }
    }
ed ecco qui il codice per l'animazione:
    private class BannerThread extends Thread{
        private Banner banner;
 
        public BannerThread(Banner banner){
            this.banner = banner;
        }
 
        public void run(){
            try{
                while(true){
                    banner.move(1);
                    sleep(10);
                }
            }catch(InterruptedException e){}
        }
 
    }
E attacco il mio banner ad un JFrame in questo modo:
...classe...
    private Banner bannerdisplay;
... private void initComponents() {
        bannerdisplay = new Banner("BUBUSETTETE", WIDTH, 40);
        BannerThread bannerthread = new BannerThread(bannerdisplay);
        bannerthread.start();
...     getContentPane().add(BorderLayout.NORTH, bannerdisplay);
    }
Ora il probblema è questo:
La Canvas viene visualizzata correttamente, ed anche l'animazione
funziona, solo che c'è un fastidiosissimo sfarfallio.
Come avete visto ho già applicato una sorta di DoubleBuffering a mano,
creando l'immagine backbuffer, e quindi scrivere su questa e poi
copiarla sul Graphics.
A questo punto lo sfarfallio è diminuito, però è ancora presente.
Come posso fare ad eliminarlo del tutto? Qualche idea?
Ho provato, all'interno del costruttore del Canvas, a utilizzare
"createBufferStrategy(2)" che ho letto su qualche forum che potrebbe
essermi d'aiuto, però mi pianta l'applicazione ritornandomi un
eccezione:
"Exception in thread "main" java.lang.IllegalStateException: Component
must have a valid peer"
che sulle API ho visto che significa che avviene "if the component is
not displayable". Ma non capisco come fare per farlo funzionare(
chiaramente catturando l'eccezione il programma parte ma skippa la mia
istruzione).
Ho trovato qualcosa al riguardo qui:
"
http://forum.java.sun.com/thread.jsp?thread=526371&forum=17&message=2525452
"
però ancora non ne salto fuori! Help Me...Please!
Un'altra domandina veloce veloce, quando si usano le Swing, è
possibile sceglierne il look & feel di default di windows nel seguente
modo:
try{                
 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}catch (...){
se però sotto windows volessi avere un look & feel tipo MacOSX cosa
dovrei usare? Ho provato a vedere in com.sun.java.swing.plaf. ma sono
presenti solo Motif e Windows.
Grazie a tutti ragazzi, aspetto con fede un aiutino dal popolo della
rete.
Ciao

 presenti solo Motif e Windows.
Anche qui ho trovato qualcosina, ho letto su un forum qualcuno che si
riferiva al seguente :
     com.sun.java.swing.plaf.mac.MacLookAndFeel
che però chiaramente io non ho.
Avanzo un ipotesi, sarà disponibile solo nel jdk per MacOS?
E se io devo creare un'applicazione destinata a girare su un Mac ma
per svilupparla ho a diposizione solo WindowsXp e Linux cosa faccio?
Ci sarà qualche libreria da installare, vero?
Grazie ancora a tutti e ciao!

Il 26 Jul 2004 11:45:01 -0700, 
ilfigli...@libero.it
 (wakko) ha
scritto:

Ciao,
Il metodo update viene richiamato automaticamente nel ridisegno di un
componente. Di solito al suo interno si trovano solo le istruzioni per
"cancellare" l'intero contenuto grafico del componente. Questa
operazione viene ottenuta tracciando un rettangolo pieno con colore
dello sfondo per tutta l'area disegnabile del componente:
public void update(Graphics g) {
     g.setColor(getBackground());
     g.fillRect(0,0,width,height);
     g.setColor(getForeground());
     paint(g);
}
Ovvio che pero in questo modo la resa grafica nn è il massimo: appunto
perche prima cancella il contenuto grafico del componente e poi lo
disegna di nuovo.... quindi si crea uno sfarfallio fastidioso.
La soluzione è appunto quella che ti hanno dato: ridefinire update in
modo che nn cancelli il contenuto grafico del componente. Anche perche
usi un double buffer quindi nn ti servirebbe a niente.... 
Per quanto riguarda il look & feel è una questione di versioni di
java... ho letto da qualche parte che è possibile con la nuova
versione di java usare il look & feel di windows xp e di mac osx...
pero nn sul secondo caso nn sono molto sicuro... è ovvio che puoi cmq
aggiungere qualsiasi look and feel, swing permette appunto di definire
interfaccie grafiche personali... dovresti cercare in giro.
Cmq esiste anche il modo di usare l'interfaccia grafica del sistema
operativo su cui stai facendo girare l'applicazione java
(getSystemLookAndFeelClassName).
Spero di esserti stato di aiuto