2012-02-10 66 views
3

当按下JButton时,My Swing应用程序将文本行打印到JScrollPane内部的JTextPane。快速操作没有问题。但是,一些JButton会调用可能需要几分钟的操作。在此期间,按钮保持灰色。JTextPane活跃

目前发生的情况是,文本是“批处理”,然后在操作结束时我同时得到数百行文本,同时按钮变得非灰色。问题是,我希望文本被附加到JTextPane中显示的文档上,以便在整个操作完成时更早出现(在附加时)。这将创造更好的用户体验。

我在做什么错?

+1

你是在UI线程中执行非UI相关的计算。它可以使用'SwingWorker'修复,如Oracle教程中所解释的:http://java.sun.com/developer/technicalArticles/javase/swingworker/ – 2012-02-10 08:02:21

回答

2

使用SwingWorker来执行后台操作。

// Your button handler 
public void actionPerformed(ActionEvent e) { 
    (new SwingWorker<Void, String>() { 
    public Void doInBackground() { 
     // perform your operation 
     // invoke publish("your string"); 
    } 

    protected void process(List<String> chunks) { 
     // append your string to the scroll pane 
    } 
    }).execute(); 
} 
1

您正在从阻止每个事件的AWT线程中直接调用代码。解决方法是将您的长期运行代码放在单独的Thread中。随着您的代码被执行并获得结果,您将通知您(使用观察者/可观察模式)的视图。当您的视图被通知时,您将更新滚动窗格内容。

您还必须验证您是否在AWT线程中运行(SwingUtilities.isEventDispatchThread())。如果您不是,那么您需要使用SwingUtilities.invokeLater()在AWT线程中发送视图的更新,因为Swing不是线程安全的。