TITLE:JToolTipをGlassPane上のコンポーネントで表示する
Posted by at 2009-05-11

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

JToolTipをGlassPane上のコンポーネントに追加した場合でも、手前に表示されるように設定します。主にSwing - ComboBox scroll and selected/highlight on glasspaneを参考にしています。
  • category: swing folder: ForceHeavyWeightPopupKey title: JToolTipをGlassPane上のコンポーネントで表示する tags: [JToolTip, GlassPane, ToolTipManager, PopupFactory] author: aterai pubdate: 2009-05-11T16:10:58+09:00 description: JToolTipをGlassPane上のコンポーネントに追加した場合でも、手前に表示されるように設定します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTNMeZI4ZI/AAAAAAAAAaY/8XHy9j6jQw0/s800/ForceHeavyWeightPopupKey.png

概要

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

サンプルコード

#spanend
#spandel
//Swing - ComboBox scroll and selected/highlight on glasspane
#spanend
#spandel
//http://forums.sun.com/thread.jspa?threadID=5315492
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
// Swing - ComboBox scroll and selected/highlight on glasspane
#spanend
#spanadd
// https://community.oracle.com/thread/1357949
#spanend
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();
}

解説

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

解説

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

参考リンク

コメント

  • -
  • JDK 1.7.0からjavax.swing.PopupFactory.forceHeavyWeightPopupKeyが無くなってしまったので、以下のように javax.swing.ClientPropertyKey.PopupFactory_FORCE_HEAVYWEIGHT_POPUPを使用する必要がある
#spanend
#spanadd
Class clazz = Class.forName("javax.swing.ClientPropertyKey");
#spanend
#spanadd
Field field = clazz.getDeclaredField("PopupFactory_FORCE_HEAVYWEIGHT_POPUP");
#spanend
#spanadd
field.setAccessible(true);
#spanend
#spanadd
combo.putClientProperty(field.get(null), Boolean.TRUE);
#spanend
#spanadd
  • -
#spanend
#spanadd
PopupFactory.setSharedInstance(new PopupFactory() {
#spanend
  @Override public Popup getPopup(Component owner, Component contents, int x, int y) throws IllegalArgumentException {
    // @param isHeavyWeightPopup true if Popup should be heavy weight,
    // protected Popup getPopup(..., boolean isHeavyWeightPopup) ...
    return super.getPopup(owner, contents, x, y, true);
  }
#spanadd
});
#spanend
#spanadd

参考リンク

コメント