gpt4 book ai didi

java - JPopupMenu 没有像它应该的那样消失

转载 作者:行者123 更新时间:2023-12-01 21:24:39 28 4
gpt4 key购买 nike

我有一个用于运行锦标赛的 Java 应用程序,在其中我构建了一个自动建议功能,该功能从数据库中获取名称并将其显示在 JPopupMenu 中。我无法根据需要复制这个错误,但偶尔一个 JPopupMenus 会像平常一样消失,除了它所在位置的轮廓仍然在屏幕上,并显示在所有内容上,包括其他程序,甚至如果我的应用程序被最小化。

这是我正在谈论的内容的屏幕截图: enter image description here

您可以看到在“Espinoza”下面仍然显示 JPopupMenu 的一些残余部分。有时内部包含文本,有时仅在空框中包含背景颜色。这个残余物纯粹是装饰性的,我还没有找到任何与它交互的方式,无论是物理上还是编程上(热编码)。

这是我用来显示 JPopupMenu 的方法:

private void resetLastNamePopup() {

Thread t = new Thread() {

@Override
public void run() {

lnPopup.setVisible(false);
lnPopup.removeAll();

if(DBHSDatabaseIntermediary.isConnected()) {

if(!(fnTextField.getText().equals("") && lnTextField.getText().equals(""))) {

JMenuItem item = null;
String[] names = DBHSDatabaseIntermediary.getLastNames(fnTextField.getText(), lnTextField.getText());
for(int i=0; i < names.length; i++) {

if(!names[i].equals(lnTextField.getText().trim())) {

item = new JMenuItem(names[i]);
item.addActionListener(lnActionListener);
item.addMouseListener(NewPlayerPanel.this);
lnPopup.add(item);

}

}

if(names.length > 0 && !names[0].equals("")) {

lnPopup.setVisible(true);

}
lnPopup.grabFocus();

}

}

}// ends run()

};

t.start();

}

提前谢谢您。

最佳答案

必须在 AWT 事件调度线程上调用 Swing 方法和构造函数。您在不同的线程上调用这些方法。结果是“未定义的行为”——这通常意味着事情有时会起作用,但并非总是有效。

您需要将 Swing 调用与数据库调用分开,这是使用 EventQueue.invokeLater 完成的。 (或其别名, SwingUtilities.invokeLater ):

private void resetLastNamePopup() {

lnPopup.setVisible(false);
lnPopup.removeAll();

final String fn = fnTextField.getText();
final String ln = lnTextField.getText();

Thread t = new Thread() {

@Override
public void run() {
if(DBHSDatabaseIntermediary.isConnected()
&& !fn.isEmpty() && !ln.isEmpty()) {

final String[] names =
DBHSDatabaseIntermediary.getLastNames(fn, ln);

// Rebuild JPopupMenu in AWT event thread.
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
for (String name : names) {
if (!name.equals(ln)) {
JMenuItem item = new JMenuItem(name);
item.addActionListener(lnActionListener);
lnPopup.add(item);
}
}

if (names.length > 0 && !names[0].isEmpty()) {
lnPopup.setVisible(true);
lnPopup.grabFocus();
}
}
});
}
}// ends run()

};
t.start();
}

有关详细信息,请参阅javax.swing package contract ,和 Concurrency in Swing在 Java 教程中。

关于java - JPopupMenu 没有像它应该的那样消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38444405/

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