我扩展了JTextField。有多个ActionListener附加到我的类,但我需要一个特别总是首先触发。有没有办法确保特定的ActionEvent始终优先?
请注意,我确实有一个对ActionListener的引用。我假设我需要覆盖一个方法,但我不确定是哪一个。
答案 0 :(得分:2)
尝试从JTextField覆盖fireActionPerformed。在新类中添加自定义ActionListener并在调用super.fireActionPerformed()
之前调用它 P:抱歉英语不好。修改:
public class CustomTextField extends JTextField {
private List<ActionListener> listeners;
public synchronized void addPriorityActionListener(ActionListener l) {
if(l == null) {
return;
}
if(listeners == null) {
listeners = new ArrayList<>();
}
listeners.add(l);
}
public synchronized void removePriorityActionListener(ActionListener l) {
if(l == null || listeners == null) {
return;
}
listeners.remove(l);
}
protected void firePriorityActionPerformed() {
if(listeners == null) {
return;
}
ActionEvent event = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, getText());
for(ActionListener listener: listeners) {
listener.actionPerformed(event);
}
}
@Override
protected void fireActionPerformed() {
firePriorityActionPerformed();
super.fireActionPerformed();
}
}
答案 1 :(得分:2)
有没有办法确保特定的ActionEvent始终优先?
Java规范不保证触发事件的顺序。
但是,我认为默认实现是添加到组件的最后一个ActionListener是第一个。
编辑:
我使用鼠标监听器
为什么使用MouseListener?当用户选中/来自字段时会发生什么?不要假设使用鼠标。在这种情况下,FocusListener将处理键盘或鼠标活动。
当用户在文本字段中按Enter键时,问题就出现了。
如果用户没有按Enter键会发生什么情况,他们只会选中下一个字段?这就是我要做的事。
这需要在其他动作列表工作之前完成。
还有哪些ActionListeners? tgext字段只有一个监听器。
无论如何,你可以回答你的问题,你可以通过使用SwingUtilities.invokeLater(...)将你的代码放在Event Dispatch Thread的末尾,以便在所有其他事件之后执行,从而有效地改变执行顺序:
public void actionPerformed(ActionEvent e)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
// add your code here
}
});
}
同样,任何依赖于事件顺序的解决方案都不是一个好的解决方案。事件的顺序可能在不同的平台上有所不同。