TITLE:JToolTipをGlassPane上のコンポーネントで表示する

Posted by at 2009-05-11

JToolTipをGlassPane上のコンポーネントで表示する

`JToolTipGlassPane`上のコンポーネントに追加した場合でも、手前に表示されるように設定します。主にSwing - ComboBox scroll and selected/highlight on glasspaneを参考にしています。

  • &jar;
  • &zip;
ForceHeavyWeightPopupKey.png

サンプルコード

//Swing - ComboBox scroll and selected/highlight on glasspane
//http://forums.sun.com/thread.jspa?threadID=5315492
try {
  Class clazz = Class.forName("javax.swing.PopupFactory");
  Field field = clazz.getDeclaredField("forceHeavyWeightPopupKey");
  field.setAccessible(true);
  label2.putClientProperty(field.get(null), Boolean.TRUE);
} catch (Exception ex) {
  ex.printStackTrace();
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、ボタンをクリックすると、二つのラベルをもつ`GlassPane`が表示されます。

  • `111...`(左)
    • `GlassPaneの下にJTooltip`が表示される
    • 親フレームの外に`JTooltip`がはみ出す場合は、正常に表示される
    • `ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false);`では効果なし?
  • `222...`(右)
    • 正常に表示されるように、常に、`JTooltip`を重量コンポーネントとして表示している
    • `PopupFactoryクラスのforceHeavyWeightPopupKeyをリフレクションで取得して、JComponent#putClientProperty`メソッドで設定
    • Swing - ComboBox scroll and selected/highlight on glasspaneの`GlassPaneJComboBox`のポップアップを正常に表示する方法を引用
    • `ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false);`としておかないと前面に表示されない環境がある?

`JDK 1.7.0の場合は、javax.swing.PopupFactory.forceHeavyWeightPopupKey`が無くなってしまったので、以下のように `javax.swing.ClientPropertyKey.PopupFactory_FORCE_HEAVYWEIGHT_POPUP`を使用します。

Class clazz = Class.forName("javax.swing.ClientPropertyKey");
Field field = clazz.getDeclaredField("PopupFactory_FORCE_HEAVYWEIGHT_POPUP");
field.setAccessible(true);
combo.putClientProperty(field.get(null), Boolean.TRUE);

参考リンク

コメント