2012-04-04 3 views
5

Я хотел нарисовать изображение на своей панели на основе данных, полученных из другого потока. Я уверен, что данные и последующий пиксельный массив работают хорошо, но 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); 
     } 
    } 
} 

Благодаря

+9

'Thread.sleep (4000);' Не блокируйте EDT (Event Dispatch Thread) - графический интерфейс будет «зависеть», когда это произойдет. Вместо вызова 'Thread.sleep (n)' реализует Swing 'Timer' для повторения задач или' SwingWorker' для длительных задач. Дополнительную информацию см. В разделе [Параллелизм в Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). –

+0

Спасибо за ваш мгновенный ответ. Но если я просто удалю оператор Thread.sleep (4000), он тоже не сработает. В чем причина этого? – Daniel

+1

Если вы просто прочитали ссылки, которые я предоставил, и выполните рекомендации, что произойдет? –

ответ

0

repaint(); Попробуйте, а затем validate(); в вашем апплета (PicturePlaza).

1

Небольшая заметка на repaint(). repaint() планирует перерисовку экрана, он не всегда будет делать это сразу же в моем опыте. Я нашел лучшее решение для прямого вызова paint().

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

Я поместил это как новую функцию для вызова своего кода, когда я хотел, чтобы он сразу рисовал. Также это не приведет к стиранию предыдущей графики на экране, вам придется сделать это вручную.

Смежные вопросы