• 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

概要

JComboBoxを編集可にしてテキスト入力部分とリスト部分にアイコンを表示します。

スクリーンショット

IconComboBox.png

サンプルコード

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

解説

上記のサンプルでは、JLabel#setIcon(...)でアイコンを追加し、リスト内の各項目にアイコンが表示されるように設定したListCellRendererJComboBoxに設定しています。

  • setEditable(false)
    • JComboBoxが編集不可の場合、リスト内の各項目だけでなくJComboBoxにもアイコンが表示される
  • setEditable(true)
    • 上:
      • JComboBoxの文字列入力欄には、アイコンが表示されない
    • 中:
      • combo.getEditor().getEditorComponent()で取得したJTextFieldMatteBorderを追加して、文字列入力欄にアイコンを表示
    • 下:
      • combo.getEditor().getEditorComponent()で取得したJTextFieldにアイコンを追加したJLabelを追加
      • アイコン(JLabel)が文字列と重ならないように、JTextFieldにはその幅だけ余白をとるように設定

参考リンク

コメント