• 追加された行はこの色です。
  • 削除された行はこの色です。
#navi(../)
*JComboBoxにアイコンを表示 [#za138060]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2004-12-27~
更新日:&lastmod;
---
category: swing
folder: IconComboBox
title: JComboBoxにアイコンを表示
tags: [JComboBox, JTextField, Icon, ListCellRenderer, MatteBorder, JLabel]
author: aterai
pubdate: 2004-12-27T01:32:14+09:00
description: JComboBoxを編集可にしてテキスト入力部分とリスト部分にアイコンを表示します。
image: https://lh5.googleusercontent.com/-4rGEnYRGuys/VQfEDJHomCI/AAAAAAAAN0o/vja8KE3Cm-o/s800/IconComboBox.png
---
* 概要 [#summary]
`JComboBox`を編集可にしてテキスト入力部分とリスト部分にアイコンを表示します。

#contents
**概要 [#sa537c90]
JComboBoxを編集可にしてテキスト入力部分とリスト部分にアイコンを表示します。
#download(https://lh5.googleusercontent.com/-4rGEnYRGuys/VQfEDJHomCI/AAAAAAAAN0o/vja8KE3Cm-o/s800/IconComboBox.png)

http://terai.xrea.jp/swing/iconcombobox/screenshot.png
* サンプルコード [#sourcecode]
#code(link){{
private static Border makeIconBorder(JComponent c, ImageIcon i) {
  int iw = i.getIconWidth();
  Border b1 = BorderFactory.createMatteBorder(0, iw, 0, 0, i);
  Border b2 = BorderFactory.createEmptyBorder(0, 5, 0, 0);
  Border b3 = BorderFactory.createCompoundBorder(b1, b2);
  return BorderFactory.createCompoundBorder(c.getBorder(), b3);
}
}}

**サンプルコード [#h76ab388]
 private static Border makeIconBorder(JComponent c, ImageIcon i) {
   Border b1 = BorderFactory.createMatteBorder(
                 0, i.getIconWidth(), 0, 0, i);
   Border b2 = BorderFactory.createEmptyBorder(0,5,0,0);
   Border b3 = BorderFactory.createCompoundBorder(b1, b2);
   return BorderFactory.createCompoundBorder(c.getBorder(), b3);
 }
* 解説 [#explanation]
上記のサンプルでは、リスト内の各項目に`JLabel#setIcon(...)`メソッドでアイコンを追加した`ListCellRenderer`を`JComboBox`に設定しています。

-[[サンプルを起動>http://terai.xrea.jp/swing/iconcombobox/sample.jnlp]]
-[[jarファイル>http://terai.xrea.jp/swing/iconcombobox/sample.jar]]
-[[ソース>http://terai.xrea.jp/swing/iconcombobox/src.zip]]
- `setEditable(false)`
-- `JComboBox`が編集不可の場合、リスト内の各項目だけでなく`JComboBox`にもアイコンが表示される
- `setEditable(true)`
-- 上:
--- `JComboBox`の文字列入力欄にはアイコンが表示されない
-- 中:
--- `combo.getEditor().getEditorComponent()`で取得した`JTextField`に`MatteBorder`を追加して文字列入力欄にアイコンを表示
-- 下:
--- `combo.getEditor().getEditorComponent()`で取得した`JTextField`にアイコンを追加した`JLabel`を追加
--- アイコン(`JLabel`)が文字列と重ならないように`JTextField`にはその幅だけ余白をとるように設定

**解説 [#ycb2dfc7]
-一番上
--デフォルトのListCellRendererを使用するJComboBoxです。
-上から二番目
--JComboBoxフィールドが編集不可の場合、ListCellRendererを実装することでアイコン表示することができます。
-下から二番目
--JComboBoxフィールドが編集可の場合、ListCellRendererを実装しても、Editor部分はアイコン表示されません。
-一番下
--JComboBoxフィールドが編集可の場合でも、MatteBorderを使用することでエディタ部分にもアイコンを表示することができます。
**参考リンク [#l13dc690]
-[[MatteBorderでラベル枠を修飾>Swing/MatteBorder]]
-[[JTextField内にアイコンを追加>Swing/IconTextField]]
* 参考リンク [#reference]
- [[MatteBorderでラベル枠を修飾>Swing/MatteBorder]]
- [[JTextField内にアイコンを追加>Swing/IconTextField]]
- [[JComboBoxの内余白>Swing/PaddingComboBox]]
- [[JComboBoxのEditorComponentにJButtonを配置>Swing/ButtonInComboEditor]]

**コメント [#z463c6ec]
* コメント [#comment]
#comment
#comment