2011-09-09 12 views
12

Uygulamam temiz bir ortamdan ilk kez başlatıldığında, işler beklediğim gibi çalışır. İki iş parçacığı üretiyorum, biri genel işlem için, diğeri grafikler için. Tüm olay GUI manipülasyon çağrıları olay gönderen iplikten yapıyorum. Başlat/Durdur, uygulayıcıdan doğru şekilde işlenir, ancak Yeniden Başlatma/Yeniden Yükleme değil. Uygulamamın içerik bölmesindeki tek Bileşen olarak drawCanvas adlı bir Tuvalim var ve bunu çizmek için çift arabelleğe almayı kullanıyorum.Bir Yeniden Yükleme ve Yeniden Başlatma Uygulamasını AppletViewer'dan düzgün bir şekilde yürütme

Burada sorunu gözlemlemek:

Ayrıca
private void setupDrawCanvas() { 
    setVisible(false); 
    setIgnoreRepaint(true); 

    getContentPane().removeAll(); 

    drawCanvas = new Canvas(); 

    drawCanvas.setName("drawCanvas"); 
    drawCanvas.setSize(
    newDrawCanvasDimension.width, 
    newDrawCanvasDimension.height); 
    drawCanvas.setIgnoreRepaint(true); 

    getContentPane().add(drawCanvas); 

    getContentPane().setVisible(true); 
    drawCanvas.setVisible(true); 
    setVisible(true); 
} 

, buradan destroy()

public void destroy() { 
    /* .. some stuff .. */ 

    /* dispose of drawCanvas */ 
    drawCanvas.setVisible(false); 
    if(drawCanvas.getBufferStrategy() != null) { 
     drawCanvas.getBufferStrategy().dispose(); 
    } 

    /* reset and disable the applet's GUI */ 
    setVisible(false); 
    getContentPane().removeAll(); 
    removeAll(); 

    /* .. some more stuff */ 

ilk kez ilgili kod: setupDrawCanvas böyle tanımlanır

public void start() { 
    /* ... some stuff */ 
    executeOnEDTAndWait( 
     new Thread() { 
      @Override 
      public void run() { 
       /* ... more stuff ... */ 
       setupDrawCanvas(); 

       if(drawCanvas.isDisplayable()) { 
        drawCanvas.createBufferStrategy(2); 
        /* ... some more stuff */ 
       } else { 
        /* This is where it runs into difficulties */ 
       } 
    /* ... */ 

her şey iyi çalışıyor. appletviewer'dan yeniden başlattığımda, tüm iş parçacıklarının bekleme durumuna girmesine neden olan ilk stop() çağrılır. Sonra destroy() benim widget temizlemek ve (yanlış) bir SetVisible yapmak EDT yanı yaptığı gibi ve invokeAndWait(), yukarı Yine bütün konuları uyanır ve onlara çıkış olanak sağlayan denir. İmha tamamlandıktan sonra appletviewer çağrıları tekrar başlat/başlat ve işlem daha önce olduğu gibi tekrar eder, ancak yukarıda belirttiğim bölgede start() başarısız olur. Bana çok az mantıklı fark ettim

İçimden appletviewer kullanarak uygulamasını klonlanmış ve sonra klon yeniden eğer beklendiği gibi ben yeniden başlatın veya klonu ilk kez yeniden çalışırken, her şey çalışacağına dair, ama ikinci kez bir istisna ile çarpacaktı. Bu sorunu tamir etmeye çalışan iken başka

şey fark ettim appletviewer ve benim uygulaması için konukçu olarak tamamen farklı bir tarayıcı eylemi; Aynı koşullarda init() ve start() numaralarını bile aramadılar. Ayrıca, yeniden başlatın ve stop() bir çağrı başka bir şey gibi görünüyor reload ->destroy() ->init() ->start() ama yürütme ortamına ince değişiklik ile.

Benim soru, yeniden başlatma önemi ve yeniden operasyonlar (yani zaman kullanıldıkları) nedir ve onlar ortaya çıktığında benim uygulaması appletviewer başarısız bir sorundur?

cevap

6

Güzel Soru. Bu soruyu cevaplamak için önce java kodlarının bloklarını anlamamız gerekiyor. biz idam edilecek construtor önce anonim, statik engeller var.

package com.test; 

import java.applet.Applet; 
import java.awt.*; 

public class AppletTest extends Applet { 
    { 
     System.out.println("I m Anonymous block"); 
    } 

    static { 
     System.out.println("I m static block"); 
    } 

    public AppletTest() 
    { 
     System.out.println("I m constructor"); 
    } 

    public void init() 
    { 
     System.out.println("init"); 
    } 

    public void start() 
    { 
     System.out.println("start"); 
    } 

    public void stop() 
    { 
     System.out.println("stop"); 
    } 

    public void destroy() 
    { 
     System.out.println("destory"); 
    } 

    public void paint(Graphics g) 
    { 
     g.drawString("test Applet",10,10); 
    } 
} 

çağırma:

<applet code="AppletTest.class" height=300 width=300></applet> 

farkı not edebilirsiniz appletviewer kullanarak bu sınıfı çalışan.uygulaması yeniden yaparken Applet ilk kez yayınlamaya Eğer

I m static block 
    I m Anonymous block 
    I m constructor 
    init 
    start 

alacak -

stop 
destory 
init 
start 

ve ikinci sorunun uygulaması yeniden yükleme

stop 
destory 
I m Anonymous block 
I m constructor 
init 
start 

üzerine, uygulama garanti etmez Farklı işletim sistemi, ağ ve donanım bileşenlerinde aynı çıktı.

İlgili konular