Domanda

Devo scrivere una semplice app Java in grado di caricare immagini, mostrarle in una forma GUI, consentire all'utente di applicare alcune trasformazioni e mostrare l'immagine trasformata. La mia soluzione funziona bene, ma l'interfaccia utente presenta un leggero sfarfallio, perché il metodo repaint viene chiamato troppo spesso (ad esempio quando l'utente ridimensiona l'immagine con un JSlider)

Il mio codice ha questo aspetto:

public class ImageCanvas extends Canvas
{
    private BufferedImage image;
    // ...

    @Override
    public void paint(Graphics g) 
    {
        Graphics2D g2d = (Graphics2D) g;
        if(image != null)
        {
             // I draw out the image...
        }
    }

    public void setImage(BufferedImage image)
    {
        this.image = image;
        this.repaint();
    }

    public void setRotation(double rotation)
    {
        this.rotation = rotation;
        this.repaint();
    }

    public void setScale(double scaleX, double scaleY) 
    { 
       //set the scaling field, then repaint ....
    }    

    // and so on...
}

E, naturalmente, ho un controllo ImageCanvas sulla mia interfaccia utente principale, e chiamo semplicemente i metodi pubblici (vedi ad esempio il metodo "setRotation" sopra) che ridipingono l'area della tela.So che è una domanda semplice, ma non trovo nemmeno una proprietà DoubleBuffered sul Canvas ...

Qualsiasi aiuto apprezzato.

È stato utile?

Soluzione

Il doppio buffering è integrato per le classi Swing (cioè derivate da JComponent).

Se desideri il doppio buffering integrato, dovresti estendere JPanel anziché Canvas e sovrascrivere paintComponent, non paint.

Altri suggerimenti

Se puoi usare JPanel, fallo.Assicurati di non sovrascrivere il metodo JPanel.paint, sostituisci invece JPanel.paintComponent. Consulta questo link per i dettagli.

Di solito i ritardi grafici in queste applicazioni possono essere causati impostando una variabile vuota nella parte superiore dello script, quindi cambiando il suo valore, quindi aspettando che il ridisegno lo aggiorni.Potresti provare a cambiare:

    setRotation(double rotation);

in modo che ruoti l'immagine con quel metodo.

Solo una cosa generale che mi capita di vedere mentre mi occupo di grafica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top