Java筆記:CheckboxMenuItem 的 setState 方法

CheckboxMenuItem

此類別只會觸發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);,因此無限遞迴就產生了。

留言