gpt4 book ai didi

java - keyPressed 监听器产生奇怪的行为

转载 作者:行者123 更新时间:2023-11-29 06:15:43 24 4
gpt4 key购买 nike

我在 jTable 中有一系列文本框和组合框。我使用框中的输入来过滤 JPQL 查询的结果,这些结果显示在 jTable 上。现在,想法是使该过程自动化,以便每次用户在框中键入一个字符时,应用程序都会自动发送查询并使用过滤后的结果更新 jTable。我试过这样做:

public class MyKeyListener extends KeyAdapter{
public void keyPressed(KeyEvent evt){
setFilters();
displayResults(); }}

setFilters()和displayResults()分别是设置参数和查询获取ResultList和更新jTable的方法。然后我将 keyPressed 添加到所有相关的文本框,以及一些用于调试的 System.out.println 行。发生的事情如下:当我输入第一个字符时,什么也没有发生。如果我输入第二个字符,KeyListener 会工作并发送查询,但仅使用第二个字符进行过滤,第一个字符将被忽略。这是我的第一个怪癖。第二个是,看着我的控制台,我意识到对于每一个成功的 Key Listened,查询都会被发送 6 次。帮助将不胜感激。转念一想,我还插入了我的 setFilters() 和 displayResults()。

  private void setFilters() {

//Auslesen der gesetzten Filter
String name=jName.getText()+"%";
String vorname= jVorname.getText()+"%";
String vvname= jVName.getText()+"%";
String vvorname=jVVorname.getText()+"%";
String mname=jMName.getText()+"%";
String strasse=jAdresse.getText()+"%";
String plz=jPlz.getText()+"%";
String ort=jOrt.getText()+"%";
String gruppe=jGruppe.getText()+"%";
String geschlecht=(String) jGeschlecht.getSelectedItem()+"%";
String mvorname=jMVorname.getText()+"%";
String firma=jFirma.getText()+"%";



//Die Query
kinderQuery = java.beans.Beans.isDesignTime() ? null : rcwPUEntityManager.createQuery("SELECT k FROM Kinder k "
+ "INNER JOIN k.vaeter vat "
+ "INNER JOIN k.muetter mut "
+ "INNER JOIN k.gruppen gru "
+ "INNER JOIN k.firmen fir "
+ "WHERE k.kindName LIKE :name "
+ "AND k.kindVorname LIKE :vorname "
+ "AND vat.vaterName LIKE :vname "
+ "AND vat.vaterVorname LIKE :vvorname "
+ "AND mut.mutterName LIKE :mname "
+ "AND mut.mutterVorname LIKE :mvorname "
+ "AND k.kindStrasse LIKE :strasse "
+ "AND k.kindPLZ LIKE :plz "
+ "AND k.kindOrt LIKE :ort "
+ "AND gru.gruppeName LIKE :gruppe "
+ "AND k.kindGeschlecht LIKE :geschlecht "
+ "AND fir.firmaName LIKE :firma ");


//Einsetzen der ausgelesenen Strings in die JPQL-Query Parameter
kinderQuery.setParameter("name", name);
kinderQuery.setParameter("vorname", vorname);
kinderQuery.setParameter("vname", vvname);
kinderQuery.setParameter("vvorname", vvorname);
kinderQuery.setParameter("mname", mname);
kinderQuery.setParameter("mvorname", mvorname);
kinderQuery.setParameter("strasse", strasse);
kinderQuery.setParameter("plz", plz);
kinderQuery.setParameter("ort", ort);
kinderQuery.setParameter("gruppe", gruppe);
kinderQuery.setParameter("geschlecht", geschlecht);
kinderQuery.setParameter("firma", firma);

}

private void displayResults(){
java.util.Collection data = kinderQuery.getResultList();
System.out.println(data);
kinderList.clear();
kinderList.addAll(data);
jTable1.repaint();
}

提前致谢!

最佳答案

问题是在keyPressed事件产生的时候文本域使用的Document还没有更新。您可以监听 keyTyped 事件,但我不推荐这样做,因为它不是最佳解决方案,而且 Swing 提供了更好的 API 以供使用。

更好的方法是使用专门为此目的设计的 DocumentListener。阅读 How to Write a Document Listener 上的 Swing 教程部分示例和解释。

关于java - keyPressed 监听器产生奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5165871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com