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ıcaprivate 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?