Swing/MenuDelayBeforePopedUp の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/MenuDelayBeforePopedUp へ行く。
- Swing/MenuDelayBeforePopedUp の差分を削除
--- category: swing folder: MenuDelayBeforePopedUp title: JMenuからJPopupMenuが表示されるまでの遅延時間を設定する tags: [JMenu, JPopupMenu] author: aterai pubdate: 2023-07-31T01:52:11+09:00 description: JMenuがサブメニューの場合、JPopupMenuが表示されるまでの遅延時間を設定します。 image: https://drive.google.com/uc?id=1M5LdPYH6ASqoI0ZrMN3X_RMQDKwy8_lB --- * 概要 [#summary] `JMenu`がサブメニューの場合、`JPopupMenu`が表示されるまでの遅延時間を設定します。 #download(https://drive.google.com/uc?id=1M5LdPYH6ASqoI0ZrMN3X_RMQDKwy8_lB) * サンプルコード [#sourcecode] #code(link){{ JPopupMenu popup = new JPopupMenu(); JMenu sub0 = new JMenu("JMenu(Default)"); sub0.add("JMenuItem:0"); sub0.add("JMenuItem:1"); popup.add(sub0); JMenu sub1 = new JMenu("JMenu(0..2000)"); sub1.setDelay(2000); sub1.add("JMenuItem:2"); sub1.add("JMenuItem:3"); popup.add(sub1); SpinnerNumberModel model = new SpinnerNumberModel(2000, 0, 2000, 100); JSpinner spinner = new JSpinner(model); model.addChangeListener(e -> sub1.setDelay(model.getNumber().intValue())); setComponentPopupMenu(popup); }} * 解説 [#explanation] - `JMenu#setDelay(...)`メソッドで`JMenu`にその`JPopupMenu`が表示されるまでの遅延時間をミリ秒単位で設定可能 -- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JMenu.html#getDelay-- JMenu#getDelay() (Java Platform SE 8)] -- ドキュメントには「`delay`のデフォルトは`0`です。」と記述されているが、実際は`BasicMenuUI#installDefaults()`で`200`ミリ秒が直接設定されている --- `UIManager`などを使用せずに直接設定されているため`LookAndFeel`を変更すると`JMenu#setDelay(...)`で設定した値がすべて`200`ミリ秒に初期化されてしまう --- `NimbusLookAndFeel`は`SynthStyle#getInt(SynthContext, "Menu.delay", 200)`などで任意の値で初期化可能 -- ドキュメントには「サブメニューを表示または非表示にするまでの、推奨される遅延時間をミリ秒単位で返します。」と記述されているが、「非表示」化にこの遅延時間を使用する`LookAndFeel`は存在しない? -- `JMenu`が`JMenuBar`に直接の子として配置されたトップレベル・メニューの場合(`JMenu#isTopLevelMenu()==true`)や、ドラッグ中はこの設定は無視される --- 「ドラッグ中は無視」: たとえば`JMenu(0)`の`JPopupMenu`が表示されている状態でマウスをドラッグして直下の`JMenu(2000)`に入る場合、この`2000`ミリ秒の遅延時間は無視されて`JMenu(2000)`の`JPopupMenu`に直ちに切り替わる --- 「ドラッグ中は無視」: たとえば`JMenu(0)`をクリックしてその`JPopupMenu`を表示状態とし、クリックしたままマウスドラッグで直下の`JMenu(2000)`にカーソルが入る場合、この`2000`ミリ秒の遅延時間は無視されて`JMenu(2000)`の`JPopupMenu`に直ちに切り替わる // -- ドキュメントには「このメソッドはルック・アンド・フィールコードのプロパティであり、様々なUI実装の特質を管理するために使用されます。」と記述されているが、意味がよく分からない * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JMenu.html#getDelay-- JMenu#getDelay() (Java Platform SE 8)] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JMenu.html#getDelay-- JMenu#setDelay(int) (Java Platform SE 8)] * コメント [#comment] #comment #comment