2012-04-04 12 views
5

Volevo disegnare un'immagine sul mio pannello in base ai dati che ricevo da un altro thread. Sono sicuro che i dati e il conseguente array di pixel funzionano bene, ma il repaint() non funzionerebbe mai. Qualcuno può dirmi cosa sta andando storto qui?repaint() non funziona

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

/** Create an image from a pixel array. **/ 
public class PicturePlaza extends JApplet 
{ 
    ImagePanel fImagePanel; 
    ReadCom readComPort; 
    Thread readPortThread; 

    public void init() { 
    // initiate the read port thread so that it can receive data 
    readComPort = new ReadCom(); 
    readPortThread = new Thread(readComPort,"ReadCom"); 
    readPortThread.start(); 

    Container content_pane = getContentPane(); 
    fImagePanel = new ImagePanel(); 
    content_pane.add (fImagePanel); 

    } 

    // Tell the panel to create and display the image, if pixel data is ready. 
    public void start() { 
     while(true){ 
      if(readComPort.newPic){ 
       fImagePanel.go(); 
      } 
      try { 
        Thread.sleep(4000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 


/** Create an image from a pixel array. **/ 
    class ImagePanel extends JPanel{ 
     Image fImage; 
     int fWidth = ReadCom.row, fHeight = ReadCom.col;  

     void go() {   
        //update the image if newPic flag is set to true     
        fImage = createImage (new MemoryImageSource (fWidth, fHeight, ReadCom.fpixel, 0, fWidth)); 
        repaint(); 
        readComPort.newPic = false; //disable the flag, indicating the image pixel has been used                
     } 

     /** Paint the image on the panel. **/ 
     public void paintComponent (Graphics g) { 
     super.paintComponent (g);  
     g.drawImage (fImage, 0, 0, this); 
     } 
    } 
} 

Grazie

+9

'Thread.sleep (4000);' Non bloccare EDT (Event Dispatch Thread) - la GUI si "congela" quando ciò accade. Invece di chiamare 'Thread.sleep (n)' implementare un timer 'Swing' per attività ripetitive o un' SwingWorker' per attività a lunga esecuzione. Vedere [Concorrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) per ulteriori dettagli. –

+0

Grazie per la tua risposta immediata. Ma se rimuovo semplicemente l'istruzione Thread.sleep (4000), non funziona altrettanto bene. Qual è la ragione per questo? – Daniel

+1

Se si leggono semplicemente i collegamenti che ho fornito e si implementano i consigli, cosa succede? –

risposta

0

Prova repaint(); e poi validate(); nel Applet (PicturePlaza).

1

Solo una piccola nota su repaint(). repaint() pianifica un ridisegno dello schermo, non lo farà sempre immediatamente nella mia esperienza. Ho trovato la soluzione migliore è quella di chiamare direttamente paint() da soli.

Graphics g; 
g = getGraphics(); 
paint(g); 

L'ho messo come una nuova funzione per chiamare il mio codice quando volevo che dipingesse immediatamente. Anche questo non cancellerà la grafica precedente sullo schermo, dovrai farlo manualmente.