• category: swing folder: EnableToolTipMode title: JToolTipの表示をウィンドウが非アクティブな場合でも有効にする tags: [JToolTip, ToolTipManager, UIManager] author: aterai pubdate: 2019-12-02T14:46:11+09:00 description: JToolTipの表示モードをすべてのウィンドウで有効にする、またはアクティブなウィンドウのみに限定するで切り替えます。 image: https://drive.google.com/uc?id=1Fpl-P9uPOWTn4O-9Xy0pbWKQZIevg_VT

概要

JToolTipの表示モードをすべてのウィンドウで有効にする、またはアクティブなウィンドウのみに限定するで切り替えます。

サンプルコード

private static final String TOOLTIP_MODE = "ToolTipManager.enableToolTipMode";
// ...
String allWindows = "allWindows";
JRadioButton radio1 = new JRadioButton(allWindows, Objects.equals(allWindows, mode));
radio1.setToolTipText("ToolTip: " + allWindows);
radio1.addItemListener(e -> UIManager.put(TOOLTIP_MODE, allWindows));

String activeApplication = "activeApplication";
JRadioButton radio2 = new JRadioButton(activeApplication, Objects.equals(activeApplication, mode));
radio2.setToolTipText("ToolTip: " + activeApplication);
radio2.addItemListener(e -> UIManager.put(TOOLTIP_MODE, activeApplication));
View in GitHub: Java, Kotlin

解説

  • allWindows
    • JFrameなどのウィンドウがアクティブかどうかにかかわらずツールチップ表示は有効
    • デフォルトはこのallWindowsBasicLookAndFeelなどの初期値
  • activeApplication
    • JFrameなどのウィンドウがアクティブな場合のみツールチップ表示は有効
    • MetalLookAndFeelWindowsLookAndFeelの初期値

  • ツールチップを表示する前にToolTipManager#showTipWindow()メソッド内で毎回UIManager.getString("ToolTipManager.enableToolTipMode")activeApplicationかを確認しているので、値の変更はすぐに有効になる
  • 文字列がactiveApplicationかを比較しているだけなのでnullなどを設定するとデフォルトのallWindowsになる
// @see javax/swing/ToolTipManager.java
String mode = UIManager.getString("ToolTipManager.enableToolTipMode");
if ("activeApplication".equals(mode)) {
  KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
  if (kfm.getFocusedWindow() == null) {
    return;
  }
}

参考リンク

コメント