Java筆記:CheckboxMenuItem 的 setState 方法
CheckboxMenuItem
此類別只會觸發ItemEvent,永遠不會觸發ActionEvent,詳情請看JDK程式碼。ItemEvent與ActionEvent是同一層的物件,都繼承自AWTEvent。
CheckboxMenuItem 的 setState(boolean b),這個函數並不會觸發ItemEvent。唯一會觸發ItemEvent的是與使用者互動,JDK說明見此,因此在ItemListener中可以很大方的使用setState,不用考慮太多事情。
那麼,假如setState會觸發ItemEvent的話又怎樣呢?
我們將不能在ItemListener中使用setState,不然可能會造成無止境的遞迴。
如下程式碼所示,這段程式碼式不讓CheckboxMenuItem被取消選取,永遠設定為選取狀態。
當setState(true);被執行,將觸發ItemEvent,itemStateChanged就又被執行,又進入到setState(true);,因此無限遞迴就產生了。
此類別只會觸發ItemEvent,永遠不會觸發ActionEvent,詳情請看JDK程式碼。ItemEvent與ActionEvent是同一層的物件,都繼承自AWTEvent。
CheckboxMenuItem 的 setState(boolean b),這個函數並不會觸發ItemEvent。唯一會觸發ItemEvent的是與使用者互動,JDK說明見此,因此在ItemListener中可以很大方的使用setState,不用考慮太多事情。
那麼,假如setState會觸發ItemEvent的話又怎樣呢?
我們將不能在ItemListener中使用setState,不然可能會造成無止境的遞迴。
如下程式碼所示,這段程式碼式不讓CheckboxMenuItem被取消選取,永遠設定為選取狀態。
import java.awt.*;
import java.awt.event.*;
class AssumeTriggerThenRecurcive implements ItemListener {
public void itemStateChanged(ItemEvent e) {
if (e.getSource() instanceof CheckboxMenuItem) {
((CheckboxMenuItem)e.getSource()).setState(true);
}
}
}
當setState(true);被執行,將觸發ItemEvent,itemStateChanged就又被執行,又進入到setState(true);,因此無限遞迴就產生了。
留言