2011-09-12 93 views
2

我正在嘗試爲applet中的java遊戲製作一個控制檯。控制檯是一個帶有TextArea的獨立框架,用於顯示加載/下載過程。 我在關閉時試圖隱藏控制檯時遇到了一些問題。從applet中關閉一個框架

下面是簡化的代碼:

//Method inherited from the Applet class 
public void init() { 
    console = new Frame(); 
    console.setSize(500, 300); 
    console.addWindowListener(new WindowAdapter(){ 
     public void windowClosing(WindowEvent e) { 
      console.setVisible(false); 
     } 
    }); 

    consoleText = new TextArea(); 
    consoleText.setSize(500, 300); 

    console.add(consoleText); 

    console.setVisible(true); 

    gameThread = new Thread() { 
     public void run() { 
      mainLoop(); 
     } 
    }; 
    gameThread.start(); 
} 

線程「gameThread」當我關閉框「控制檯」簡單地掛起。即使我替換「console.setVisible(false);」與「console.setExtendedState(Frame.ICONIFIED);」,線程仍然掛起沒有任何警告。 在瀏覽器中運行applet時,我必須殺死任務管理器中的進程。很煩人。

使用JFrame而不是完全相同的東西,除了錯誤更難以重現。

我只是想讓用戶能夠擺脫控制檯。

有沒有人有想法?謝謝 !

+1

我的建議是 - 轉儲小程序,並使用[Java Web Start]啓動框架('JFrame')遊戲(http://stackoverflow.com/tags/ Java的Web啓動/信息)。問題將得到解決,JWS相對於從小應用程序啓動的框架(包括但不限於用戶可以關閉瀏覽器並仍然使用遊戲)提供了許多優勢。 –

+0

我只使用框架作爲控制檯來顯示加載內容。遊戲在Applet本身的Canvas中運行。 Java web start很棒,但我認爲applet比java web start應用程序提供更多的透明度:對用戶來說,它就像一個flash遊戲。 – Klems

回答

2

我認爲你不應該爲此使用Frame/JFrame,而應該使用JDialog,因爲窗口表現爲對話框。還要確保你使用的是JApplet而不是Applet。

編輯
請注意,我不能根據您顯示的代碼片段重現您的問題。考慮創建併發布可直接向我們展示問題的SSCCE

編輯2
我SSCCE不會重現您的問題:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class AppletEg extends JApplet { 
    private static final int MAX_LOOP = 30; 
    private static final long SLEEP_TIME = 500; 
    private JFrame console; 
    private JTextArea consoleText; 
    private Thread gameThread; 

    @Override 
    public void init() { 
     console = new JFrame(); 
     console.setSize(500, 300); 
     console.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      console.setVisible(false); 
     } 
     }); 

     consoleText = new JTextArea(); 
     consoleText.setPreferredSize(new Dimension(500, 300)); 

     console.add(new JScrollPane(consoleText)); 

     console.setVisible(true); 

     gameThread = new Thread() { 
     public void run() { 
      mainLoop(); 
     } 
     }; 
     gameThread.start(); 
    } 

    private void mainLoop() { 
     for (int i = 0; i < MAX_LOOP; i++) { 
     System.out.println("I: " + i); 
     try { 
      Thread.sleep(SLEEP_TIME); 
     } catch (InterruptedException e) { 
     } 
     } 
    } 
} 

編輯3
使用一個JDialog我SSCCE:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class AppletEg extends JApplet { 
    private static final int MAX_LOOP = 30; 
    private static final long SLEEP_TIME = 500; 
    private JDialog console; 
    private JTextArea consoleText; 
    private Thread gameThread; 

    @Override 
    public void init() { 
     Window win = SwingUtilities.getWindowAncestor(this); 
     console = new JDialog(win); 
     consoleText = new JTextArea(); 
     consoleText.setPreferredSize(new Dimension(500, 300)); 

     console.add(new JScrollPane(consoleText)); 
     console.pack(); 
     console.setLocationByPlatform(true); 
     console.setVisible(true); 

     gameThread = new Thread() { 
     public void run() { 
      mainLoop(); 
     } 
     }; 
     gameThread.start(); 
    } 

    private void mainLoop() { 
     for (int i = 0; i < MAX_LOOP; i++) { 
     System.out.println("i: " + i); 
     try { 
      Thread.sleep(SLEEP_TIME); 
     } catch (InterruptedException e) { 
     } 
     } 
    } 
} 
+0

@Klems:請參閱修改 –

+0

我很抱歉,但我完全無法自己重新創建錯誤。我提供了代碼來顯示線程/事件是如何完成的。有很多線要重寫。在線程中,我將很多圖像加載到OpenGL紋理上:這個bug可能來自任何地方。我仍然不明白爲什麼會發生。框架如何與線程通信超出了我的想象。感謝你,我至少知道這不是因爲AWT:這個bug明顯來自mainLoop()方法。它只發生在加載過程中:遊戲運行時,我可以在沒有掛起的情況下關閉框架。無論如何,我找到了一個更優雅的方式來做到這一點。 – Klems