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
'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. –
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
Se si leggono semplicemente i collegamenti che ho fornito e si implementano i consigli, cosa succede? –