我擴展了JTextField。有多個ActionListener附加到我的課程中,但我需要特別注意一個始終先開火。有沒有辦法確保一個特定的ActionEvent總是首先?Fire ActionEvent第一個
請注意,我有一個對我的ActionListener的引用。我假設我需要重寫一個方法,但我不確定哪一個是。
我擴展了JTextField。有多個ActionListener附加到我的課程中,但我需要特別注意一個始終先開火。有沒有辦法確保一個特定的ActionEvent總是首先?Fire ActionEvent第一個
請注意,我有一個對我的ActionListener的引用。我假設我需要重寫一個方法,但我不確定哪一個是。
嘗試重寫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();
}
}
有沒有一種方法,以確保總是在特定的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
}
});
}
同樣,任何依賴於事件順序的解決方案都不是一個好的解決方案。事件的順序在不同平臺上可能會有所不同。
'但我特別需要一個總是先開火。「 - 爲什麼?聽起來很糟糕的設計。給我們真正的需求,而不是你想要的解決方案,我們可能會提出一個更好的方法。 – camickr
請參閱[什麼是XY問題?](http://meta.stackexchange.com/q/66377) –
我的JTextField顯示格式化的貨幣字符串。當用戶點擊文本框時,它切換到它的實際值。例如,文本框顯示$ 1.00,但是當用戶點擊它來編輯它時,它會顯示1.0。 – user489041