如何停止 SwingWorker?

2024-01-08

我怎样才能阻止SwingWorker做他的工作吗?我知道有cancel()方法,但我最多能做的就是匿名创建一个新的SwingWorker这就是工作。

这是供参考的代码:

public void mostrarResultado(final ResultSet resultado) {

    new SwingWorker<Void, Object[]>() {

        @Override
        public Void doInBackground() {

            // TODO: Process ResultSet and create Rows.  Call publish() for every N rows created.+
            DefaultTableModel modelo = new DefaultTableModel();
            jTableResultados.removeAll();
            int columnas;
            int res = 0;
            try {
                ResultSetMetaData metadata = resultado.getMetaData();
                columnas = metadata.getColumnCount();
                Object[] etiquetas = new Object[columnas];
                jProgressBar.setIndeterminate(true);
                for (int i = 0; i < columnas; i++) {
                    etiquetas[i] =
                            metadata.getColumnName(i + 1);
                }
                modelo.setColumnIdentifiers(etiquetas);
                jTableResultados.setModel(modelo);

                while (resultado.next() && !this.isCancelled()) {
                    res++;
                    Object fila[] = new Object[columnas];
                    for (int i = 0; i < columnas; i++) {
                        fila[i] = resultado.getObject(i + 1);
                    }
                    modelo.addRow(fila);
                    publish(fila);
                }
                jProgressBar.setIndeterminate(false);
                if (res == 0) {
                    JOptionPane.showMessageDialog(jPanelClientes.getParent(), "No se encontraron resultados con los criterios de búsqueda definidos", "Sin resultados", JOptionPane.INFORMATION_MESSAGE);
                }
            } catch (SQLException ex) {
                LOG.log(Level.SEVERE, "Excepcion: ", ex);
                JOptionPane.showMessageDialog(jPanelClientes.getParent(), "Error en al ejecutar la busqueda seleccionada", "Error", JOptionPane.ERROR_MESSAGE);
            }
            return null;
        }
    }.execute();
}

实际上,这项工作完成得很好并且发布没有任何问题,但考虑到我使用数据库,可能会发生查询有太多结果并且完整发布所需的时间需要一些时间,因此用户必须能够取消任务并运行新任务。

显然,worker 与取消按钮事件是不同的方法,因此我无法调用 Workercancel() method.

尝试将工人作为该类的属性,但没有成功:

    public class myClass extends javax.swing.JFrame {
      private SwingWorker<Void, Object[]> tarea;

但当我去:

tarea = new SwingWorker<Void,Object[]>(){...} 

我得到不兼容的类型,发现无效,需要 SwingWorker,我完全没有想法。

有小费吗?

Thanks


这不是问题的答案(即如何取消,我认为这已经解决了),而是如何将后台处理与视图/模型更新分开。伪代码概要:

public static class MyDBWorker extends SwingWorker<Void, Object[]> {

    private JTable table;
    private DefaultTableModel model;
    private ResultSet resultado;

    public MyDBWorker(JTable table, ResultSet resultado) {
        this.table = table;
        this.resultado = resultado;
    }

    @Override
    protected Void doInBackground() throws Exception {
        ResultSetMetaData metadata = resultado.getMetaData();
        int columnas = metadata.getColumnCount();
        Object[] etiquetas = new Object[columnas];
        for (int i = 0; i < columnas; i++) {
            etiquetas[i] = metadata.getColumnName(i + 1);
        }
        publish(etiquetas);
        while (resultado.next() && !this.isCancelled()) {
            Object fila[] = new Object[columnas];
            for (int i = 0; i < columnas; i++) {
                fila[i] = resultado.getObject(i + 1);
            }
            publish(fila);
        }
        return null;
    }


    @Override
    protected void process(List<Object[]> chunks) {
        int startIndex = 0;
        // first chunk, set up a new model
        if (model == null) {
            model = new DefaultTableModel();
            model.setColumnIdentifiers(chunks.get(0));
            table.setModel(model);
            startIndex = 1;
        }
        for (int i = startIndex; i < chunks.size(); i++) {
            model.addRow(chunks.get(i));
        }
    }

    @Override
    protected void done() {
        // nothing to do, we were cancelled
        if (isCancelled()) return;
        // check for errors thrown in doInBackground
        try {
            get();
            // all was well in the background thread
            // check if there are any results
            if (table.getModel().getRowCount() == 0) {
                // show message
            }
        } catch (ExecutionException e) {
            // we get here if f.i. an SQLException is thrown
            // handle it as appropriate, f.i. inform user/logging system
        } catch (InterruptedException e) {
            // 
        }
    }

}

// use it
SwingWorker worker = new MyDBWorker(table, resultado);
PropertyChangeListener stateListener = new PropertyChangeListener() {

    @Override
    public void propertyChange(PropertyChangeEvent e) {
        if (e.getNewValue() == SwingWorker.StateValue.STARTED) {
            progressBar.setIndeterminate(true);
        }
        if (e.getNewValue() == SwingWorker.StateValue.DONE) {
            progressBar.setIndeterminate(false);
        }

    }

};
worker.addPropertyChangeListener(doneListener);
worker.execute();

Edit

修复了过程中的错误:向模型添加行必须始终从批次的第一个索引开始,处理标头时除外。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何停止 SwingWorker? 的相关文章

随机推荐

  • 什么是 DynamicProxyGenAssembly2 程序集?

    我使用 Moq 进行单元测试 为了测试内部接口 我必须向 DynamicProxyGenAssembly2 程序集声明 InternalsVisibleTo 属性 我们运行模糊测试 这很有用 因为我们可以发现这种方法的一些模糊问题 由于 D
  • 如何同时启动两个进程然后等待两个进程完成?

    我想同时启动两个进程 并确保在继续其他步骤之前完成所有进程 你能帮我吗 我已经尝试过线程 它不能同时启动两个线程并等待完成 final CyclicBarrier gate new CyclicBarrier 3 Thread r2 new
  • 具有多个子项的 WPF UserControl

    我有一个用户控件 我希望能够拥有多个子控件 它已经有 StackPanel 作为它的子项 那么我做错了什么 最终 我希望该控件自动包含一些它自己的子元素 然后在使用时允许在其元素之一中放置更多的子元素 我试过MSDN 的如何覆盖逻辑树 ht
  • 设置新窗口的位置

    你好 我打开一个新窗口 a href Hilfe a 此时新窗口出现在左上角 我如何设置位置 以便它出现在其他地方 通过提供top and left window open Default aspx NewWindow top 100 le
  • 如何使用 FSWatch 在 Mac OSX 上查看文件更改?

    我正在尝试使用fswatch https github com alandipert fswatch将 Linux bash 脚本中的以下几行翻译为能够在 Mac OSX 上运行 inotifywait r m myfolder while
  • 对于 EBFE 的 ARM 等效项要发出哪些字节?

    在 x86 中 如果你想引发无限循环 你可以发出一个ebfe http ebfe org 基本上是跳转到当前指令 ARM 中相当于 EBFE 的是什么 那将是0xeafffffe 自身的无条件分支
  • SPARQL 1.1 蕴含机制和使用 FROM 子句的查询

    我目前正在记录 测试 SPARQL 1 1 蕴涵制度 并且建议反复指出 范围图与活动图在图上等效 但它没有指定活动图指的是什么 它是查询中使用的数据集吗 商店中所有图表的并集 作为确定这一点的测试 我得到了这张图的 URIed
  • 安卓配置改变了

    我有兴趣知道当 Android 设备旋转时 即配置更改时 哪些方法被覆盖 onSaveInstanceState onConfigurationChanged onRestoreInstanceState 类似的东西 对我来说 聆听与更改配
  • okhttp 与 HttpURLConnection 的关系

    很多人跟我说 HttpURLConnection 是从 android 4 4 开始基于 okhttp 的 但是当我深入研究okhttp的代码时 OkHttpURLConnection是从HttpURLConnection扩展的子类 那么
  • Java反思:类字段和方法的顺序是否标准化?

    在 Java 类上使用反射来访问所有字段 方法等 这些元素是否有标准化的顺序 在某些标准中指定 当然 我could凭经验检查 但我需要知道它是否总是 相同 EDIT 我等待问题 我需要订单做什么 长话短说 我有 JAXB 注释的类 并且不想
  • 在特定条件下获取行以交换表

    我目前有一个父表 CREATE TABLE members member id SERIAL NOT NULL UNIQUE PRIMARY KEY first name varchar 20 last name varchar 20 ad
  • 检测显示器是否关闭

    我有一个信息亭类型的应用程序 如果液晶电视关闭 我需要收到通知 以便我可以惩罚某人 我正在运行带有 nVidia 显卡和 nVidia 驱动程序的 Ubuntu 10 10 电视通过 HDMI 插入 我看过了nvidia settings
  • Visual Studio Code 中的 JSON 文件错误:预期逗号 json(514)

    我在使用 Visual Studio Code 时遇到了一个奇怪的问题 我的以下 JSON 文件有问题 attribute numeroConta operator value 0030152201 问题被指责为 值 在第二个数字零 问题如
  • OnClientClick 不适用于 asp.net LinkBut​​ton

    我有一个asp netlinkbutton 其中包含OnClientClick属性 但是函数内OnClientClick永远不会被调用 它直接跳转到OnClick功能 以下是我使用 LinkBut ton 的两种方式
  • CSS3 Border-Radius 的一个边框颜色不同,正在渗色

    我有一个使用边框半径的带有圆角的流体宽度 div 以及 div 一侧颜色不同的大边框 当浏览器窗口足够小时 边框都会按其应有的方式运行 然而 当我放大窗口尺寸时 我开始看到 div 中心的颜色渗出 我想知道是否有人知道可能的解决方案 div
  • Android 以编程方式安装 apk 错误 - 包解析错误

    我在我的页面上创建一个 Edittext 以允许用户通过下载 apk 并安装来更新应用程序 我正在使用 loojp 库来处理异步任务 我的活动代码 f0textupdate setOnClickListener new View OnCli
  • 快速移动鼠标时不会触发 OnMouseOut 事件(GWT - 所有浏览器)

    我有一个代表蓝色矩形的 DIV 其中包含文本 HELLO 当用户单击它时 它的颜色更改为红色和文本 BYE 当用户将鼠标光标移出时 恢复其原始颜色和文本 这些样式在 CSS 中描述 文本由 GWT 事件控制 请参见下面的 Java 代码 问
  • Python 中具有特定方差的随机数

    在 Python 程序中 我需要生成具有特定的 用户控制的方差的正态分布随机数 我怎样才能做到这一点 Use random normalvariate http docs python org library random html ran
  • 从 Angular 前端调用 Azure AD 安全 Web API

    我目前正在开发一个 Angular 前端 它使用 MSAL 来对用户进行身份验证 该前端应调用 Web API 也托管在 Azure 中 该 API 由 Azure Active Directory 保护 虽然我轻松地设法使用 Angula
  • 如何停止 SwingWorker?

    我怎样才能阻止SwingWorker做他的工作吗 我知道有cancel 方法 但我最多能做的就是匿名创建一个新的SwingWorker这就是工作 这是供参考的代码 public void mostrarResultado final Res