首先消防ActionEvent

时间:2015-05-20 14:50:20

标签: java swing actionlistener jtextfield

我扩展了JTextField。有多个ActionListener附加到我的类,但我需要一个特别总是首先触发。有没有办法确保特定的ActionEvent始终优先?

请注意,我确实有一个对ActionListener的引用。我假设我需要覆盖一个方法,但我不确定是哪一个。

2 个答案:

答案 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
        }
    });
}

同样,任何依赖于事件顺序的解决方案都不是一个好的解决方案。事件的顺序可能在不同的平台上有所不同。