Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Double Buffering
Forum - Java - Double Buffering

Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 13:08
Martedì, 07/12/2010
salve a tutti...

vorrei delle spiegazioni maggiri a riguardo...non riesco a mettere in pratica questa tecnica.. ho la seguente classe:


public class DesignAnimation extends JPanel implements Runnable {

    private String word;
    private Point currentPoint;
    private Image window, i;
    private String direction;
    private static boolean running;
    private Graphics graphic;
    private Image bufferedImage;
    private Graphics graphicBuffer;

public DesignAnimation(Image window, Image i, String word, Point initialPoint) {         graphicBuffer = i.getGraphics();
        graphicBuffer.drawImage(i, currentPoint.x, currentPoint.y, this);
        repaint();
        this.i = i;
        this.word = word;
        this.window = window;
        currentPoint = initialPoint;
        direction = "right";
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(window, 0, 0, getSize().width, getSize().height, this);
        g.setFont(new Font("TimesRoman", Font.PLAIN, 40));
        g.setColor(Color.red);
        g.drawImage(bufferedImage, currentPoint.x, currentPoint.y, this);
        int center = (i.getWidth(this) / 2) - 150;
        g.drawString(word, currentPoint.x + center, currentPoint.y);
    }

    public void run() {
        running = true;
        while (!isInterrupted()) {
            if (direction.equals("right")) {
                currentPoint.x++;
                repaint();
                waitFor(5);
                if (currentPoint.x == (520)) {
                    direction = "left";
                }
            } else {
                if (direction.equals("left")) {
                    currentPoint.x--;
                    repaint();
                    waitFor(5);
                    if (currentPoint.x == 0) {
                        direction = "right";
                    }
                }
            }
        }
    }

    public static void interrupt() {
        running = false;
    }

    private boolean isInterrupted() {
        return true ? running == false : false;
    }

    private void waitFor(long time) {
        try {
            Thread.sleep(time);
        } catch (InterruptedException ex) {
        }
    }
}

mi da questo errore :
Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: getGraphics() not valid for images created with createImage(producer)
        at sun.awt.image.ToolkitImage.getGraphics(ToolkitImage.java:292)
        at test.DesignAnimation.<init>(DesignAnimation.java:30)
        at test.Picture.<init>(Picture.java:35)
        at test.Picture$2.run(Picture.java:132)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


non capisco cosa dovrei sistemare... spero in un vostro aiuto ...grazie: )

Ultima modifica effettuata da killer il 07/12/2010 alle 13:09
PM Quote
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 18:04
Martedì, 07/12/2010
Nessun aiuto ? :(

Ultima modifica effettuata da killer il 07/12/2010 alle 19:09
PM Quote
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 23:42
Martedì, 07/12/2010
ki mi aiuta ? :(  ho bisogno di capire sto doppio buffering... :( non mi funziona..perche ?! :(

Ultima modifica effettuata da killer il 08/12/2010 alle 16:53
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:10
Mercoledì, 08/12/2010
Codice sorgente - presumibilmente Java

  1. private boolean isInterrupted() {
  2.         return true ? running == false : false;
  3.     }



Questo intanto e' sbagliato... rileggiti l'uso della sintassi dell'operatore ? :

Testo quotato


Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: getGraphics() not valid for images created with createImage(producer)



Mi sembra abbastanza chiaro... non tutti gli oggetti Image supportano getGraphics, e l'oggetto Image su cui stai cercando di disegnare non supporta questo metodo...

Ma visto che non hai specificato esattamente cosa vuoi fare, e' impossibile darti direzioni per un metodo alternativo su quel che stai cercando di fare.


Il mio blog: https://piero.dev
PM Quote
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 19:40
Mercoledì, 08/12/2010
come mai e sbagliata  la condizione '?:'    ?   io ritorno vero se running==false e quindi non è in esecuzione altrimenti torno falso...

Ultima modifica effettuata da killer il 08/12/2010 alle 19:40
PM Quote
Avatar
paoloricciuti (Ex-Member)
Pro


Messaggi: 137
Iscritto: 27/04/2010

Segnala al moderatore
Postato alle 2:21
Giovedì, 09/12/2010
Testo quotato

Postato originariamente da killer:

come mai e sbagliata  la condizione '?:'    ?   io ritorno vero se running==false e quindi non è in esecuzione altrimenti torno falso...


Perchè la sintassi corretta sarebbe:
Codice sorgente - presumibilmente Java

  1. boolean bool= running==false?true:false;



PM Quote
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 11:17
Giovedì, 09/12/2010
allora ho creato questa classe .... l'ho testata..ma l'immagine lampeggia sempre quando scorre.. e crea un minimo sfarfallio... per il double buffering  quali modifiche dovrei apportare ? fatemi sapere presto perche dalle applets non capisco molto bene.. tra l'altro dopo aver fatto il copia incolla, mi da sempre l'errore nel costruttore sul offscreenImage.getGraphics().....chi puo aiutarmi a risolvere il problema ? :)

package test;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;

/**
*
* @author....
*/
public class DoubleBuffering extends JPanel implements KeyListener {

    Image initImage;
    int currX;
    int currY;

    public DoubleBuffering(Image image, Dimension dim) {
        setDoubleBuffered(true);
        currY = 300;
        currX = 300;
        initImage = image.getScaledInstance(dim.width, dim.height, Image.SCALE_FAST);
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
            case KeyEvent.VK_UP:
                currY -= 5;
                break;
            case KeyEvent.VK_RIGHT:
                currX += 5;
                break;
            case KeyEvent.VK_DOWN:
                currY += 5;
                break;
            case KeyEvent.VK_LEFT:
                currX -= 5;
                break;
        }
        repaint();
    }

    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void update(Graphics g) {
        paintComponent(g);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(initImage, currX, currY, this);
    }
}


PM Quote