Ich wollte ein Bild auf meinem Panel basierend auf den Daten, die ich von einem anderen Thread erhalte, zeichnen. Ich bin mir sicher, dass die Daten und das daraus folgende Pixel-Array gut funktionieren, aber das Repaint() würde nie funktionieren. Kann mir jemand sagen, was hier schief läuft?repaint() funktioniert nicht
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);
}
}
}
Dank
'Thread.sleep (4000);' Blockieren Sie den EDT (Event Dispatch Thread) nicht - die GUI wird "eingefroren", wenn das passiert. Statt '' 'Thread.sleep (n)' aufzurufen, implementieren Sie einen Swing 'Timer' für wiederkehrende Aufgaben oder einen' SwingWorker' für lang andauernde Aufgaben. Siehe [Parallelität in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) für weitere Details. –
Vielen Dank für Ihre sofortige Antwort. Aber wenn ich einfach die Anweisung Thread.sleep (4000) lösche, funktioniert es auch nicht. Was ist der Grund dafür? – Daniel
Wenn Sie einfach die angegebenen Links lesen und die Empfehlungen implementieren, was passiert dann? –