Java 正确地阻止摇摆工人

Java 正确地阻止摇摆工人,java,mysql,swing,Java,Mysql,Swing,我想用JTextField改进对数据库的gui无滞后实时搜索 假设您有一个大型数据库,其中包含0001002等条目。。。高达一百万只是一个例子;条目也可以包含字符串。每次按键时,我都会让Swingworker在添加的DocumentListener中搜索jTextfield的当前内容,因为我希望每次按键后立即开始搜索 假设我想搜索123并将其输入JTextField 当我输入1并搜索包含1的所有条目时,第一个swingworker立即启动,并在其完成方法中设置jTable的模型: public

我想用JTextField改进对数据库的gui无滞后实时搜索

假设您有一个大型数据库,其中包含0001002等条目。。。高达一百万只是一个例子;条目也可以包含字符串。每次按键时,我都会让Swingworker在添加的DocumentListener中搜索jTextfield的当前内容,因为我希望每次按键后立即开始搜索

假设我想搜索123并将其输入JTextField

当我输入1并搜索包含1的所有条目时,第一个swingworker立即启动,并在其完成方法中设置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) {

        }
    }

}

但不知何故,1和12 Swingworker仍然不会停止,都会覆盖TableModel。。。因此,我最终得到了1-swingworker的结果…

通常,我所做的是使用Swing计时器在搜索开始前注入一个小延迟,这意味着如果您键入123,每次键入时,计时器都会重新启动,直到允许运行为止,实际搜索不会启动,因为SingWorker无法启动,您需要1-监视cancel stae,2-支持线程的可中断状态,这并不是所有阻塞方法都支持对JTextField的延迟回调
    if(swingworker != null){
                swingworker.cancel(true);
    }
    swingworker = new swingworker_class(null);
    swingworker.execute();