Swing/ForceHeavyWeightPopupKey のバックアップの現在との差分(No.4)
TITLE:JToolTipをGlassPane上のコンポーネントで表示する
Posted by aterai 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:
概要
JToolTip
をGlassPane
上のコンポーネントに追加した場合でも、手前に表示されるように設定します。主にSwing - ComboBox scroll and selected/highlight on glasspaneを参考にしています。
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
#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
が表示されます。
参考リンク
- Swing - ComboBox scroll and selected/highlight on glasspane
- JComboBox の GlassPane 上でのレンダリング
- Swing - Why glass pane requires setLightWeightPopupEnabled(false)?
- JInternalFrameをModalにする
-
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);
を設定しないと前面に表示されない環境がある?
- 正常に表示されるように常に
コメント
- -
-
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
- -
-
Java 9
以降では以下のようなコードでPopup
を常にHeavyWeight
で開くことが可能になった
#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
参考リンク
- Swing - ComboBox scroll and selected/highlight on glasspane
- JComboBox の GlassPane 上でのレンダリング
- Swing - Why glass pane requires setLightWeightPopupEnabled(false)?
- JInternalFrameをModalにする
- Mixing Heavyweight and Lightweight Components