JPopupMenuのラベルをタイトルとして表示する
Total: 16
, Today: 16
, Yesterday: 0
Posted by aterai at
Last-modified:
Summary
JPopupMenu
のラベルをTitledBorder
を使用してタイトル表示するよう設定します。
Screenshot

Advertisement
Source Code Examples
JPopupMenu popup1 = new JPopupMenu("JPopupMenu#setLabel(...)") {
@Override public void updateUI() {
setBorder(null);
super.updateUI();
Border border = getBorder();
String title = getLabel();
if (!isCompoundMotifBorderBorder(border) && title != null) {
Color color = UIManager.getColor("Separator.foreground");
Border underline = BorderFactory.createMatteBorder(1, 0, 0, 0, color);
Border labelBorder = BorderFactory.createTitledBorder(
underline,
title,
TitledBorder.CENTER,
TitledBorder.ABOVE_TOP,
getFont(),
getForeground());
setBorder(BorderFactory.createCompoundBorder(border, labelBorder));
}
}
};
private static boolean isCompoundMotifBorderBorder(Border border) {
boolean b0 = border instanceof CompoundBorder;
boolean b1 = b0 && isMotifBorder(((CompoundBorder) border).getInsideBorder());
boolean b2 = b0 && isMotifBorder(((CompoundBorder) border).getOutsideBorder());
return b1 || b2;
}
private static boolean isMotifBorder(Border border) {
return border.getClass().getName().contains("MotifBorders");
}
View in GitHub: Java, KotlinDescription
- 左:
MotifLookAndFeel
ではデフォルトでJPopupMenu#setLabel(title)
で設定したタイトルがMotifBorders$MotifPopupMenuBorder
を使用してBorder
として表示されるMotifLookAndFeel
以外ではJPopupMenu#setLabel(title)
でタイトルを設定しても表示には使用されない
- 右:
MotifLookAndFeel
以外でもJPopupMenu#setLabel(title)
で設定されたタイトルを表示するようTitledBorder
やMatteBorder
、JPopupMenu
のLookAndFeel
デフォルトBorder
をCompoundBorder
で組み合わせてタイトル表示するBorder
を作成MotifLookAndFeel
の場合はタイトル表示が重複しないよう上記のBorder
は設定しないが、LookAndFeel
がJPopupMenu
に設定したタイトルを表示するかどうかをチェックする方法が存在しない?- このため、このサンプルでは
CompoundBorder
のInsideBorder
、OutsideBorder
のどちらかのクラス名にMotifBorders
が含まれているかどうかで判断している
- このため、このサンプルでは
Reference
- JPopupMenu#setLabel(String)
- java - How to force JPopupMenu to show title even if Look and Feel UI dictates otherwise? - Stack Overflow
- JPopupMenuにマウスドラッグで位置変更を可能にするヘッダを追加する
- こちらは
TitledBorder
ではなくJLabel
をJPopupMenu
先頭に追加してヘッダにタイトルを表示している
- こちらは