Swing/ToolTipInComboBox のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- 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);
}
}
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
のドロップダウンリストを開いた状態でツールチップを表示すると描画がおかしくなる場合がある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);
});
}
}