正确地停止Swingworkers

时间:2015-10-10 03:29:20

标签: java mysql swing

我希望使用JTextField改进数据库的无gui-lag“实时搜索”。

想象一下,你有一个大型数据库,其条目如0001,0002,......高达一百万(只是一个例子;条目也可以包含字符串)。每次当我按下一个键时,我都会启动一个Swingworker来搜索jTextfield的当前内容(在添加的DocumentListener中),因为我希望每次按下一个键后立即开始搜索。

让我们假设我想搜索“123”并将其输入JTextField ......

第一个swingworker在我输入“1”时立即启动并搜索包含“1”的所有条目并且在其中完成() - 方法设置jTable的模型:

public static class Xrefreshen_speed_up extends SwingWorker<Void, Void> {

    public JXTable JXTabelle;
    public String sql_anweisung;
    public ResultSet mySQLresultset;

    public String get_sql() {
        return sql_anweisung;
    }

    public Xrefreshen_speed_up(JXTable jXT, String str) {
        this.JXTabelle = jXT;
        this.sql_anweisung = str;

    }

    @Override
    public Void doInBackground() {
        try {
            Thread.sleep(100);
            System.out.println("Following query is now executed: " + sql_anweisung);
            Thread.sleep(100);
            mySQLresultset = Operationen_MySQL.getInstance().ResultSet_aus_Anweisung(sql_anweisung);
            Thread.sleep(100);




        } catch (Exception e) {
            if (!e.getMessage().contains("sleep")) {
                JOptionPane.showMessageDialog(null, "jXTable refresh: Could not refresh table:\n" + e.getMessage());
            }
        }
        return null;
    }

    @Override
    public void done() {
        try {
            if (!isCancelled()) {
                Thread.sleep(100);
                if (!isCancelled()) {
                    TableModel resultSetToTableModel = DbUtils.resultSetToTableModel(this.mySQLresultset);
                    if (!isCancelled()) {
                    JXTabelle.setModel(resultSetToTableModel);
                    JXTabelle.packAll();

                    }
                    //Boolean bool = get();
                } else {
                    System.out.println("Another Swingworker interrupted execution.");
                }

            } else {
                System.out.println("Tabellenfüllung von anderer Tabellenfüllung unterbrochen");
            }
        } catch (Exception e) {

        }
    }

}

但是因为我输入了“123”,还有2个Swingworkers:一个搜索包含“12”的所有条目,一个搜索“123”。显然,搜索“1”会得到更多的结果,因此,swingworker需要比搜索“12”或“123”的swingworker更长的时间...所以最后一个swingworker(“123”)将首先完成并将设置TableModel我的JTable ......但在那之后,“12”-Swingworker将覆盖模型......然后是“1”-Swingworker ......你得到它......

所以我尝试在jTextfield的documentlistener中跟随并将多个Thread.sleep放入Swingworker中(参见上面的代码):

    if(swingworker != null){
                swingworker.cancel(true);
    }
    swingworker = new swingworker_class(null);
    swingworker.execute();

但不知何故,“1” - 和“12” - 练习者仍然不会停下来并且都会覆盖TableModel ......所以我最终得到了“1” - 旋转工作者的结果......

0 个答案:

没有答案