Закрытие фрейма из апплета - PullRequest
       35

Закрытие фрейма из апплета

2 голосов
/ 12 сентября 2011

Я пытаюсь сделать консоль для Java-игры, в апплете. Консоль представляет собой независимый фрейм с 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();
}

Поток "gameThread" просто зависает, когда я закрываю фрейм "console". Даже когда я заменяю "console.setVisible (false);" с "console.setExtendedState (Frame.ICONIFIED);", поток все еще зависает без какого-либо предупреждения. Запуская апплет в браузере, я должен убить процесс в диспетчере задач. Очень раздражает.

Использование JFrame делает то же самое, за исключением того, что ошибку труднее воспроизвести.

Я просто хочу, чтобы пользователь мог избавиться от консоли.

У кого-нибудь есть идея? Спасибо!

1 Ответ

2 голосов
/ 12 сентября 2011

Я думаю, что для этого вам следует использовать не Frame / JFrame, а JDialog, так как окно ведет себя как диалог. Также убедитесь, что вы используете JApplet, а не апплет.

Редактировать
Обратите внимание, что я не могу воспроизвести вашу проблему, основываясь на отображаемом фрагменте кода. Подумайте о создании и публикации 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) {
         }
      }
   }
}
...