Я хотел нарисовать изображение на своей панели на основе данных, полученных из другого потока. Я уверен, что данные и последующий пиксельный массив работают хорошо, но repaint() никогда не будет работать. Может ли кто-нибудь сказать мне, что здесь происходит не так?repaint() не работает
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);
}
}
}
Благодаря
'Thread.sleep (4000);' Не блокируйте EDT (Event Dispatch Thread) - графический интерфейс будет «зависеть», когда это произойдет. Вместо вызова 'Thread.sleep (n)' реализует Swing 'Timer' для повторения задач или' SwingWorker' для длительных задач. Дополнительную информацию см. В разделе [Параллелизм в Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). –
Спасибо за ваш мгновенный ответ. Но если я просто удалю оператор Thread.sleep (4000), он тоже не сработает. В чем причина этого? – Daniel
Если вы просто прочитали ссылки, которые я предоставил, и выполните рекомендации, что произойдет? –