//在文本框快速输入文本后,将窗体关闭,程序并未结束(有时会退出).
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class Test extends JFrame {
public Test() {
buildContext();
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setSize(600, 400);
setLocationRelativeTo(null);
setVisible(true);
}
private void buildContext() {
JPanel panel = new JPanel();
JTextField textField = new JTextField(10);
textField.getDocument().addDocumentListener(
new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
System.out.println("insert");
}
@Override
public void removeUpdate(DocumentEvent e) {
}
});
panel.add(textField);
setContentPane(panel);
}
public static void main(String[] args) {
new Test();
}
}
[b][color=blue]我也遇到过,描述如下:
不使用中文输入法,程序正常退出。如果使用中文输入法,程序不退出。即使使用中文输入法,输入英文。程序还是无法退出。[/color]
按照API的描述:[/b]
[quote]
DISPOSE_ON_CLOSE
static final int DISPOSE_ON_CLOSEThe dispose-window default window close operation.
[b]Note: When the last displayable window within the Java virtual machine (VM) is disposed of, the VM may terminate. See AWT Threading Issues for more information.
[/b]
[/quote]
[b]DISPOSE_ON_CLOSE , 如果程序的最后一个窗口,调用此方法时,会退出JVM。
但是调试可以发现,程序执行完了,还是4个线程在运行:
Thread[AWT-Shutdown]
Deamon Thread[AWT-Windows]
Thread [AWT-EventQueue-0]
Thread[DestoryJavaVM][/b]
[color=blue]
换成EXIT_ON_CLOSE就可以了。一直不清楚为什么,但是可以肯定 [b]与中文输入法有关![/b][/color]
因为你使用了
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
建议改用
setDefaultCloseOperation(EXIT_ON_CLOSE);
参见:
DO_NOTHING_ON_CLOSE(在 WindowConstants 中定义):不执行任何操作;要求程序在已注册的 WindowListener 对象的 windowClosing 方法中处理该操作。
HIDE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册的 WindowListener 对象后自动隐藏该窗体。
DISPOSE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册 WindowListener 的对象后自动隐藏并释放该窗体。
EXIT_ON_CLOSE(在 JFrame 中定义):使用 System exit 方法退出应用程序。仅在应用程序中使用。
[size=x-large][color=red]建议你不要使用setDefaultCloseOperation(DISPOSE_ON_CLOSE);
在你的Test构造方法里加一个WindowListener...
我在jdk1.5下运行正常.[/color][/size]
[code="java"] public Test() {
buildContext();
setSize(600, 400);
setLocationRelativeTo(null);
setVisible(true);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
// TODO Auto-generated method stub
}
});
} [/code]
[size=x-large][color=red]希望对你有所帮助.[/color][/size]