概要
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);
}
}
View in GitHub: Java, Kotlin解説
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);
});
}
}