我正在尝试在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更难重现。
我只是希望用户能够摆脱控制台。
有人有想法吗?谢谢!
答案 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) {
}
}
}
}