Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swing JTextPane活跃度_Swing_Jscrollpane_Jtextpane - Fatal编程技术网

Swing JTextPane活跃度

Swing JTextPane活跃度,swing,jscrollpane,jtextpane,Swing,Jscrollpane,Jtextpane,按下JButton时,我的Swing应用程序将文本行打印到JScrollPane内部的JTextPane。对于快速操作,没有问题。但是,有些jbutton调用的操作可能需要几分钟的时间。在此期间,按钮保持灰色 当前发生的情况是,文本被“成批处理”,然后在操作结束时,在按钮变为非灰色的同时,我一次得到数百行。问题是,我希望附加到JTextPane中显示的文档的文本能够更快地出现(在附加时),而不是在整个操作完成时出现。这将创造更好的用户体验 我做错了什么?您直接从阻止每个事件的AWT线程中调用代码

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

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


我做错了什么?

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

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

使用a执行后台操作

// 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();
}
//您的按钮处理程序
已执行的公共无效操作(操作事件e){
(新SwingWorker(){
公共无效doInBackground(){
//执行您的操作
//调用发布(“您的字符串”);
}
受保护的无效进程(列表块){
//将字符串附加到滚动窗格
}
}).execute();
}

您正在UI线程中执行与UI无关的计算。可以使用
SwingWorker
进行修复,如Oracle教程中所述: