Swing/ToolTipInComboBox のバックアップ(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ToolTipInComboBox へ行く。
  - 1 (2018-02-15 (木) 14:23:42)
- 2 (2018-04-17 (火) 16:27:29)
- 3 (2019-11-26 (火) 14:28:56)
- 4 (2021-06-03 (木) 09:46:35)
- 5 (2025-01-03 (金) 08:57:02)
- 6 (2025-01-03 (金) 09:01:23)
- 7 (2025-01-03 (金) 09:02:38)
- 8 (2025-01-03 (金) 09:03:21)
- 9 (2025-01-03 (金) 09:04:02)
- 10 (2025-06-19 (木) 12:41:37)
- 11 (2025-06-19 (木) 12:43:47)
 
- category: swing folder: ToolTipInComboBox title: JComboBoxの各アイテムやArrowButtonにそれぞれToolTipTextを設定する tags: [JComboBox, JToolTip, JLayer] author: aterai pubdate: 2017-04-24T14:34:47+09:00 description: JComboBoxの各リストアイテムやArrowButtonに、それぞれ異なるToolTipTextを設定します。 image: https://drive.google.com/uc?id=1-hvVHO5A6M8VTO8QPye3epe-ZazLLTzfDQ
概要
JComboBoxの各リストアイテムやArrowButtonに、それぞれ異なるToolTipTextを設定します。
Screenshot

Advertisement
サンプルコード
private static JComponent makeComboBox() {
  JComboBox<String> combo = new JComboBox<>(new String[] {"aaa", "bbbbb", "c"});
  combo.setRenderer(new DefaultListCellRenderer() {
    @Override public Component getListCellRendererComponent(
        JList<?> list, Object value, int index,
        boolean isSelected, boolean cellHasFocus) {
      Component c = super.getListCellRendererComponent(
          list, value, index, isSelected, cellHasFocus);
      if (c instanceof JComponent) {
        ((JComponent) c).setToolTipText(String.format("Item%d: %s", index, value));
      }
      return c;
    }
  });
  return new JLayer<>(combo, new ToolTipLayerUI<>());
}
class ToolTipLayerUI<V extends JComboBox> extends LayerUI<V> {
  @Override public void installUI(JComponent c) {
    super.installUI(c);
    if (c instanceof JLayer) {
      ((JLayer) c).setLayerEventMask(AWTEvent.MOUSE_MOTION_EVENT_MASK);
    }
  }
  @Override public void uninstallUI(JComponent c) {
    if (c instanceof JLayer) {
      ((JLayer) c).setLayerEventMask(0);
    }
    super.uninstallUI(c);
  }
  @Override protected void processMouseMotionEvent(
        MouseEvent e, JLayer<? extends V> l) {
    JComboBox<?> c = l.getView();
    if (e.getComponent() instanceof JButton) {
      c.setToolTipText("JButton");
    } else {
      c.setToolTipText("JComboBox: " + c.getSelectedItem());
    }
    super.processMouseMotionEvent(e, l);
  }
}
解説
- JComboBox本体- JComboBox#setToolTipText(...)メソッドで- ToolTipTextを設定した場合、- ArrowButtonや編集可の場合の- JTextFieldなどのすべての子コンポーネントに同じテキストが設定される- 参考: BasicComboBoxUI#updateToolTipTextForChildren()
 
- 参考: 
- ドロップダウンリスト内のリストアイテムにToolTipTextは設定されない
 
- リストアイテム
- セルレンダラーにDefaultListCellRenderer#setToolTipText(...)メソッドでToolTipTextを設定
 
- セルレンダラーに
- ArrowButton- JComboBox本体とは別の- ToolTipTextを設定するため、- JLayerを使用- LayerUI#processMouseMotionEvent(...)をオーバーライドして、- JButton上にマウスカーソルが入ったら- JButton#setToolTipText(...)で- ToolTipTextを変更
 
 
- JComboBoxにフォーカスが存在する状態でドロップダウンリストを開き(- ArrowButtonをマウスクリックではなく、- JComboBox本体をマウスクリック、またはSpaceキーを使用)ツールチップを表示すると描画が乱れる場合がある- MetalLookAndFeelのみ
- ドロップダウンリストがHeavyWeightWindowかLightWeightWindowかは無関係
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CustomJComboBoxTest2 {
  public JComponent makeUI() {
    JComboBox<String> box = new JComboBox<>();
    box.addItem("Item 1");
    box.addItem("Item 2");
    box.setToolTipText("TooTip");
    JPanel p = new JPanel(new BorderLayout());
    p.setBorder(BorderFactory.createEmptyBorder(60, 20, 60, 20));
    p.add(box);
    return p;
  }
  public static void main(String... args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new CustomJComboBoxTest2().makeUI());
      f.setSize(320, 240);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}