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が挿入されることに注意する必要がある。