зачем звонить перекрасить в этот код? - PullRequest
2 голосов
/ 03 февраля 2012

если вы добавляете экземпляр jpanel на панель содержимого, вызывается метод paintComponent, верно?

content_pane.add (fDrawingPanel);

так почему бы вам назвать "перекрасить" в первой строке метода run()?(там написано "нарисовать сообщение о загрузке, но оно уже должно быть нарисовано, потому что paintComponent был вызван раньше, и когда fShow имеет значение true, мы не устанавливаем его обратно в false, поэтому, я думаю, этот код, должен быть вызван один раз):

public class MediaTrackApplet extends JApplet
                       implements Runnable
{
  // Need a reference to the panel for the
  // thread loop.
  DrawingPanel fDrawingPanel;

  // Parameters to track the image
  MediaTracker fTracker;
  Image fImg;
  int fImageNum = 0;
  boolean fShow = false;
  String fMessage ="Loading...";

  /** Use a MediaTracker to load an image.**/
  public void init () {
    Container content_pane = getContentPane ();

    // Create an instance of DrawingPanel
    fDrawingPanel = new DrawingPanel (this);

    // Add the DrawingPanel to the contentPane.
    content_pane.add (fDrawingPanel);

    // Get image and monitor its loading.
    fImg = getImage (getCodeBase (), "m20.gif.jpg" );
    fTracker = new MediaTracker (this);

    // Pass the image reference and an ID number.
    fTracker.addImage (fImg, fImageNum);
  } // init

  /** If the image not yet loaded, run the thread
    * so the run() will monitor the image loading.
   **/
  public void start () {
    if (!fTracker.checkID (fImageNum) ) {
        Thread thread = new Thread (this);
        thread.start ();
    } else
        // Unloading/reloading web page can will leave
        // checkID true but fShow will be false.
        fShow = true;
  } // start

  /** Use a thread to wait for the image to load 
    * before painting it.
   **/
  public void run ()  {
    // Paint the loading message
    repaint ();
    // The wait for the image to finish loading
    try {
      fTracker.waitForID (fImageNum );
    } catch (InterruptedException e) {}

    // Check if there was a loading error
    if (fTracker.isErrorID (fImageNum ))
        fMessage= "Error";
    else
        fShow = true;
    // Repaint with the image now if it loaded OK
    repaint ();
  } // run

}// class MediaTrackApplet


/** This JPanel subclass draws an image on the panel if
  * the image is loaded. Otherwise, it draws a text message.
 **/
class DrawingPanel extends JPanel {
  MediaTrackApplet parent = null;

  DrawingPanel (MediaTrackApplet parent) {
    this.parent = parent;
  }// ctor

  public void paintComponent (Graphics g) {
    super.paintComponent (g);

    // Add your drawing instructions here
    if (parent.fShow)
        g.drawImage (parent.fImg,10,10,this);
    else
        g.drawString (parent.fMessage, 10,10);
  } // paintComponent

} // class DrawingPanel

Спасибо

1 Ответ

2 голосов
/ 03 февраля 2012

Вы имеете в виду EDT ?

Да.Этот почтенный, но вышедший на пенсию пример, относится к эпохе, предшествовавшей нашему современному пониманию, что объекты Swing GUI должны создаваться и обрабатываться only в потоке диспетчеризации событий .Первоначальный вызов repaint() приводит к публикации нового Runnable на EventQueue, позволяя фоновому потоку завершать загрузку изображений в ожидании последующего repaint().См. Также Свойства согласованности памяти и связанный с этим пример .

...