Swing/LayoutCompoundLabel の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/LayoutCompoundLabel へ行く。
- Swing/LayoutCompoundLabel の差分を削除
--- category: swing folder: LayoutCompoundLabel title: JLabelのアイコンとテキストのどちらにマウスカーソルがあるかを調査する tags: [JLabel, JToolTip, Icon, JMenuItem] author: aterai pubdate: 2020-03-02T18:44:05+09:00 description: JLabelのアイコンとテキストのどちらの上にマウスカーソルが存在するかでツールチップの表示内容を変更します。 image: https://drive.google.com/uc?id=1abUKg4L5olw6cF_cly2Pbg9-tXkkWuth --- * 概要 [#summary] `JLabel`のアイコンとテキストのどちらの上にマウスカーソルが存在するかでツールチップの表示内容を変更します。 #download(https://drive.google.com/uc?id=1abUKg4L5olw6cF_cly2Pbg9-tXkkWuth) * サンプルコード [#sourcecode] #code(link){{ Icon icon = UIManager.getIcon("OptionPane.informationIcon"); JLabel label = new JLabel("OptionPane.informationIcon", icon, SwingConstants.LEADING) { private final Rectangle viewRect = new Rectangle(); private final Rectangle iconRect = new Rectangle(); private final Rectangle textRect = new Rectangle(); @Override public String getToolTipText(MouseEvent e) { SwingUtilities.calculateInnerArea(this, viewRect); SwingUtilities.layoutCompoundLabel( this, this.getFontMetrics(this.getFont()), this.getText(), this.getIcon(), this.getVerticalAlignment(), this.getHorizontalAlignment(), this.getVerticalTextPosition(), this.getHorizontalTextPosition(), viewRect, iconRect, textRect, this.getIconTextGap()); String tip = super.getToolTipText(e); if (tip == null) { return null; } else if (iconRect.contains(e.getPoint())) { return "Icon: " + tip; } else if (textRect.contains(e.getPoint())) { return "Text: " + tip; } else { return "Border: " + tip; } } }; label.setOpaque(true); label.setBackground(Color.GREEN); label.setBorder(BorderFactory.createMatteBorder(20, 10, 50, 30, Color.RED)); label.setToolTipText("ToolTipText ToolTipText"); }} * 解説 [#explanation] - `SwingUtilities.calculateInnerArea(...)`メソッドでコンポーネントから`Border`の余白を除去した矩形領域を取得 - `SwingUtilities.layoutCompoundLabel(...)`メソッドで上記の矩形領域を基準にアイコン領域、テキスト領域を計算し、引数で取得 -- 戻り値はクリップされた文字列になるが、上記のサンプルでは未使用 - `SwingUtilities.layoutCompoundLabel(...)`メソッドで上記の矩形領域を基準にアイコン領域、テキスト領域を計算して引数で取得 -- 戻り値はクリップされた文字列になるが上記のサンプルでは未使用 - `JLabel`だけではなく`JMenuItem`などでも`SwingUtilities.layoutCompoundLabel(...)`メソッドでアイコン領域、テキスト領域を取得可能 * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/SwingUtilities.html#layoutCompoundLabel-javax.swing.JComponent-java.awt.FontMetrics-java.lang.String-javax.swing.Icon-int-int-int-int-java.awt.Rectangle-java.awt.Rectangle-java.awt.Rectangle-int- SwingUtilities#layoutCompoundLabel(...) (Java Platform SE 8)] - [https://stackoverflow.com/questions/60144453/how-to-set-a-tooltip-for-a-jmenuitem java - How to set a tooltip for a JMenuItem? - Stack Overflow] * コメント [#comment] #comment #comment