MenuElementインタフェースによる階層には注意


このようにメニュー階層が定義されている場合、考えるコードとオブジェクトの階層は

  • コード
JMenuBar menuBar = new JMenuBar();
JMenu menuA = new JMenu("A");
menuA.add(new MenuItem("A_1"));
menuA.add(new MenuItem("A_2"));
menuA.add(new MenuItem("A_3"));
menuBar.add(menuA);
  • 階層
javax.swing.JMenuBar
 |
 +--javax.swing.JMenu "A"
      |
      +--javax.swing.JMenuItem "A_1"
      |
      +--javax.swing.JMenuItem "A_2"
      |
      +--javax.swing.JMenuItem "A_3"

であり、確かにこれは正しいはずなのだが、しかし表題にあるインタフェースのメソッド(MenuElement#getSubElements())でメニュー階層をトラバースすると、なんとオブジェクト階層は以下のようになるのだった。

javax.swing.JMenuBar
  |
  +--javax.swing.JMenu "A"
       |
       +--javax.swing.JPopupMenu "null"
            |
            +--javax.swing.JMenuItem "A_1"
            |
            +--javax.swing.JMenuItem "A_2"
            |
            +--javax.swing.JMenuItem "A_3"

これには嵌った。(というか直感的ではないし、こういう実装は嫌いだ)

同メソッドでメニュー階層(それもJMenu、JPopupMenuを透過に)をトラバースする場合は階層の先頭にはJPopupMenuが挿入されることに注意する必要がある。