JTextField类, 窗口关闭后,程序未退出

//在文本框快速输入文本后,将窗体关闭,程序并未结束(有时会退出).

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]