Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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
Java JTable未从SwingWorker线程更新_Java_Swing_Jtable_Swingworker_Jide - Fatal编程技术网

Java JTable未从SwingWorker线程更新

Java JTable未从SwingWorker线程更新,java,swing,jtable,swingworker,jide,Java,Swing,Jtable,Swingworker,Jide,我目前有一个JTable,其中填充了一系列数据,这些数据构成了导入屏幕的基础。当我选择完想要或不想要的更新后,我按下Apply按钮,更新成功应用,但JTable没有完全更新 这是处理应用更改的方法的代码: private void doProcessChanges() { ChangeProcessor cp = new ChangeProcessor(); final List<Integer> rowsToRemove = new ArrayList<Int

我目前有一个JTable,其中填充了一系列数据,这些数据构成了导入屏幕的基础。当我选择完想要或不想要的更新后,我按下Apply按钮,更新成功应用,但JTable没有完全更新

这是处理应用更改的方法的代码:

private void doProcessChanges() {
    ChangeProcessor cp = new ChangeProcessor();
    final List<Integer> rowsToRemove = new ArrayList<Integer>();
    BeanTableModel<UpdateModel> model = (BeanTableModel<UpdateModel>) table.getModel();

    for (int i=0; i<model.getRowCount(); i++) {
        UpdateRow ur = mode.getObject(i);
        if (ur.isAccepted() <> ChangeAcceptance.NO_ACTION) {
           cp.processChange(ur);
           rowsToRemove.add(i);
        }
    }

   SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            for (int row : rowsToRemove) {
                model.removeObject(row);
                model.fireTableDataChanged();
            }
    }
);
}
private void doProcessChanges(){
ChangeProcessor cp=新的ChangeProcessor();
最终列表rowsToRemove=newarraylist();
BeanTableModel模型=(BeanTableModel)table.getModel();

对于(int i=0;i您的片段显示了不正确的同步。特别是,您可以从后台线程访问
AbstractTableModel
的子类。相反,请将
列表rowsToRemove
传递给其构造函数中的工作者


附录:您可以在EDT上执行的
process()
实现中更新
TableModel
,而不是
invokeLater()
。此外,您不必更新
fireTableDataChanged()
,后者“通知所有监听器表行中的所有单元格值可能已更改”。
removeObject()
实现应该触发影响更改所需的最不普遍的事件。

您的片段显示不正确的同步。特别是,您从后台线程访问
AbstractTableModel
的子类。相反,将
列表rowsToRemove
传递给其构造函数中的工作者


附录:您可以在EDT上执行的
process()
实现中更新
TableModel
,而不是
invokeLater()
。此外,您不必更新
fireTableDataChanged()
,后者“通知所有监听器表行中的所有单元格值可能已更改”。
removeObject()
实现应该触发影响更改所需的最不普遍的事件。

请编辑您的问题,以包括显示您的
publish()
process()
实现的问题。我目前没有
publish()
process()
方法的实现。
ur.isAccepted()ChangeAcceptance.NO_ACTION
什么意思?这个问题是关于调试的,有真实的数据,不像论坛上的问题,如果你丢失了数据,Jide就不重要了,看,嗯,那些动态生成的模型是否链接到可见的JTable,我很怀疑……请编辑你的问题,包括一个显示你的
发布实现的问题lish()
process()
。我目前没有
publish()
process()
方法的实现。
ur.isAccepted()ChangeAcceptance.NO_ACTION
什么意思?这个问题是关于调试的,有真实的数据,不像论坛上的问题,如果你缺少数据,Jide就不重要了,看,嗯,那些动态生成的模型是否链接到可见的JTable,我很怀疑。。。
 SwingWorker<Object, Object> worker = new SwingWorker<Object, Object>() {

                    @Override
                    protected Object doInBackground() throws Exception {
                        doProcessChanges();
                        return null;
                    }

                    @Override
                    protected void done() {
                        try {
                            get();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } catch (ExecutionException e) {
                            e.printStackTrace();
                        }
                    }
                };