我写了个GUI的程序。在程序运行的时候(比如点击某个按钮,程序做一些写文件操作),点击关闭按钮不起作用了,只能到任务管理器强制关闭。大家知道是为什么吗?程序不运行(比如没开始写文件)的时候是可以关闭的。怎么才可以在程序运行的时候关闭呢?

解决方案 »

  1.   

    感觉你在创建frame的时候少写了一个语句
    但是我现在在公司,以前做的那些例子没带。
    构造器里面加上
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    试一试
      

  2.   


    “读文件”这个操作是不是通过界面控件触发的?
    不要在控件的 listener 方法里直接读,建立一个 SwingWorker 然后 execute() ,在它的 doInBackground() 里读。
      

  3.   

    SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
    doSomething();
    }
    });
      

  4.   

    你说得对,我是在listener里面写的。那个 SwingWorker的execute在哪里触发?
      

  5.   

    把文件操作写在doinbackground里面,在listener里面写new Task().execute()即可private class Task extends SwingWorker<Void, Void>{ @Override
    protected Void doInBackground() throws Exception {

    //write file 
    return null;
    }
    }
      

  6.   


    不用推测了,只能是这个原因。
    把写文件操作放入单独线程后,仍然要注意几个细节问题:
    1、该线程如果是常规线程(非守护线程),即便主线程关闭GUI界面消失,程序也不会实际结束;程序会一直等到文件写入完毕才真的结束;
    2、如果1这种情况下,写文件线程因为其他原因被阻塞了(比如等待某对象的notify啥的),那么这个程序就永远不结束了;
    3、如果该线程是守护线程,那么主线程关闭就会强制结束程序,但这可能导致你得到一个损坏的文件。
      

  7.   


    缺省创建的就是常规线程,守护线程要:setDaemon(true);