2015-05-20 4 views
0

Я расширил JTextField. К моему классу прилагается несколько ActionListeners, но мне нужно, в частности, всегда стрелять первым. Есть ли способ обеспечить, чтобы конкретный ActionEvent всегда был первым первым?Fire ActionEvent first

Обратите внимание, что у меня есть ссылка на мой ActionListener. Я предполагаю, что мне нужно переопределить метод, но я не уверен, какой из них есть.

+0

'но мне нужно, в частности, всегда стрелять первым.' - Почему? Звучит неплохо. Дайте нам реальное требование, а не ваше попытку решения, и мы сможем предложить лучший подход. – camickr

+0

См. [Что такое проблема XY?] (Http://meta.stackexchange.com/q/66377) –

+0

В моем JTextField отображается форматированная денежная строка. Когда пользователь нажимает текстовое поле, он переключается на свое реальное значение.Например, текстовое поле отображает $ 1.00, но когда пользователь нажимает на него для его редактирования, он отображает 1.0. – user489041

ответ

2

Попробуйте переопределить fireActionPerformed от JTextField. Добавьте пользовательский ActionListener в новый класс и позвоните ему до вызова super.fireActionPerformed()

Ps: извините за плохой английский.

Edit:

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(); 
    } 

} 
2

Есть ли способ, чтобы гарантировать, что конкретный ActionEvent всегда первым первым?

Спецификация Java не гарантирует порядок, в котором запускаются события.

Однако, я считаю, что реализация по умолчанию заключается в том, что последний компонент ActionListener, добавленный в компонент, является первым.

Edit:

Я использую слушателя мыши

Почему вы используете MouseListener? Что происходит, когда пользователь вводит вкладку в/из поля? Не предполагайте использование мыши. В этом случае FocusListener будет обрабатывать активность клавиатуры или мыши.

Проблема возникает, когда пользователь нажимает кнопку ввода в текстовое поле.

Что произойдет, если пользователь не нажимает кнопку ввода, и они просто переходят в следующее поле? Это то, что я сделал бы.

Это должно произойти до того, как другие исполнители действий сделают свою работу.

Другие лидеры боев? В поле tgext будет только один прослушиватель.

Во всяком случае, может быть, действительно ответить на ваш вопрос, вы можете эффективно изменить порядок выполнения, используя SwingUtilities.invokeLater (...), чтобы разместить свой код на конце события диспетчерского Thread так выполняется после всех других событий:

public void actionPerformed(ActionEvent e) 
{ 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      // add your code here 
     } 
    }); 
} 

Опять же, любое решение, зависящее от порядка событий, не является хорошим решением. Порядок событий может отличаться на разных платформах.