我希望使用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” - 旋转工作者的结果......