【问题标题】:Use SwingWorker to add rows to jTable and update the GUI使用 SwingWorker 向 jTable 添加行并更新 GUI
【发布时间】:2011-01-21 20:33:48
【问题描述】:

我正在尝试创建一个 jTable,一旦单击按钮,它就会一次添加一行,其中只有一个从零开始的数字,然后继续添加行,直到它到达第 1000000 行。我正在使用 SwingWorker 的 doInBackground , publish 和 process 方法来增加行计数器并添加每一行,这意味着在添加行时 gui 不会冻结。然而,当运行时,我可以看到行号在增加,但是它只添加一行并不断更改这一行,即一行被添加到表中,并且它的行号增加,所以我最终得到一行,最后有一个1000000 的数量。下面是我的 SwingWorker 代码,任何 hep 将不胜感激,这个问题让我彻夜难眠!! :/

    //inside the button's ActionPerformed method

    SwingWorker<Vector, Vector> worker = new SwingWorker<Vector, Vector>() {

    @Override
    protected Vector doInBackground()
    {       
        int i = 0;
        Vector v = new Vector();
        //while(!isCancelled())
        while(i < 100000000)
        {
            v.clear();
            //v = gen.runAlgorithm2();
            v.add(i);

            i++;             
            publish(v); 
        }

        return v;
    }

    @Override
    protected void process(List rowsList)
    {
       if(rowsList.size() > 0)
       {
           Vector row = (Vector)rowsList.get(rowsList.size() - 1);
           DefaultTableModel tModel = (DefaultTableModel)jTable1.getModel();

           //tModel.insertRow(0, row);
           tModel.addRow(row);            
       }

    }
    };
    worker.execute();

【问题讨论】:

    标签: java user-interface swing jtable swingworker


    【解决方案1】:

    您一遍又一遍地publish() 使用相同的Vector 对象。一旦你publish()它,你必须创建一个新的。试试这个:

    @Override
    protected Vector doInBackground()
    {       
        int i = 0;
        while(i < 100000000)
        {
            Vector v = new Vector();
            v.add(i);
    
            i++;             
            publish(v); 
        }
    
        return v;
    }
    

    要解决跳过行的问题,您只需要处理rowsList 中的每个元素,而不是只处理第一个元素。像这样:

    @Override
    protected void process(List<Vector> rowsList)
    {
       for(Vector row : rowsList){
           DefaultTableModel tModel = (DefaultTableModel)jTable1.getModel();
           tModel.addRow(row);            
       }
    }
    

    【讨论】:

    • 非常感谢您的回复,这解决了表格中只添加一行的问题。但是现在每行之间的行号增加了几千,我理解这是因为每次调用 publish() 时都不会运行 process 方法,并且向量会排队直到调用 process。我不确定如何克服这个问题并添加从 0 到 1000000 的每一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多