2015-05-20 32 views
0

我擴展了JTextField。有多個ActionListener附加到我的課程中,但我需要特別注意一個始終先開火。有沒有辦法確保一個特定的ActionEvent總是首先?Fire ActionEvent第一個

請注意,我有一個對我的ActionListener的引用。我假設我需要重寫一個方法,但我不確定哪一個是。

+0

'但我特別需要一個總是先開火。「 - 爲什麼?聽起來很糟糕的設計。給我們真正的需求,而不是你想要的解決方案,我們可能會提出一個更好的方法。 – camickr

+0

請參閱[什麼是XY問題?](http://meta.stackexchange.com/q/66377) –

+0

我的JTextField顯示格式化的貨幣字符串。當用戶點擊文本框時,它切換到它的實際值。例如,文本框顯示$ 1.00,但是當用戶點擊它來編輯它時,它會顯示1.0。 – user489041

回答

2

嘗試重寫JTextField中的fireActionPerformed。在新班級中添加自定義ActionListener並在致電super.fireActionPerformed()之前給他打電話()

ps:對不起英語不好。

編輯:

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是第一個。

編輯:

我用鼠標監聽

你爲什麼要使用的MouseListener?當用戶選擇/退出該字段時會發生什麼?不要假設鼠標使用。在這種情況下,FocusListener將處理鍵盤或鼠標活動。

當用戶在文本字段上按下Enter時,問題就會出現。

如果用戶沒有按回車,他們只是選項卡到下一個字段會發生什麼?這就是我會做的。

這需要發生在其他動作列表者做他們的事情之前。

還有什麼其他的ActionListeners?一個tgext字段只能有一個監聽器。

反正你也許回答你的問題,你可以有效地使用SwingUtilities.invokeLater(...)把你的代碼在事件分派線程結束,因此所有其他事件之後執行更改執行的順序:

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

同樣,任何依賴於事件順序的解決方案都不是一個好的解決方案。事件的順序在不同平臺上可能會有所不同。