概要

JMenuがサブメニューの場合、JPopupMenuが表示されるまでの遅延時間を設定します。

サンプルコード

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);
View in GitHub: Java, Kotlin

解説

  • JMenu#setDelay(...)メソッドでJMenuにそのJPopupMenuが表示されるまでの遅延時間をミリ秒単位で設定可能
    • JMenu#getDelay() (Java Platform SE 8)
    • ドキュメントには「delayのデフォルトは0です。」と記述されているが、実際はBasicMenuUI#installDefaults()200ミリ秒が直接設定されている
      • UIManagerなどを使用せずに直接設定されているためLookAndFeelを変更するとJMenu#setDelay(...)で設定した値がすべて200ミリ秒に初期化されてしまう
      • NimbusLookAndFeelSynthStyle#getInt(SynthContext, "Menu.delay", 200)などで任意の値で初期化可能
    • ドキュメントには「サブメニューを表示または非表示にするまでの、推奨される遅延時間をミリ秒単位で返します。」と記述されているが、「非表示」化にこの遅延時間を使用するLookAndFeelは存在しない?
    • JMenuJMenuBarに直接の子として配置されたトップレベル・メニューの場合(JMenu#isTopLevelMenu()==true)や、ドラッグ中はこの設定は無視される
      • 「ドラッグ中は無視」: たとえばJMenu(0)をクリックしてそのJPopupMenuを表示状態とし、クリックしたままマウスドラッグで直下のJMenu(2000)にカーソルが入る場合、この2000ミリ秒の遅延時間は無視されてJMenu(2000)JPopupMenuに直ちに切り替わる

参考リンク

コメント