从小程序关闭框架

时间:2011-09-12 00:54:38

标签: java applet awt frame

我正在尝试在applet中为java游戏制作一个控制台。控制台是一个独立的Frame,带有TextArea,用于显示加载/下载进度。 当我试图在关闭时隐藏控制台时,我遇到了一些问题。

以下是简化代码:

//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();
}

当我关闭Frame“console”时,线程“gameThread”就会挂起。即使我更换“console.setVisible(false);”使用“console.setExtendedState(Frame.ICONIFIED);”,线程仍然挂起而没有任何警告。 在浏览器中运行applet时,我必须在任务管理器中终止该进程。非常烦人。

使用JFrame代替完全相同的事情,除了bug更难重现。

我只是希望用户能够摆脱控制台。

有人有想法吗?谢谢!

1 个答案:

答案 0 :(得分: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
我的SSCCE使用JDialog:

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) {
         }
      }
   }
}