---
category: swing
folder: ComboEditorPlaceholder
title: ComboBoxEditorにJLayerを設定してプレースホルダ文字列を表示する
tags: [JComboBox, ComboBoxEditor, JLayer]
author: aterai
pubdate: 2019-04-29T15:55:58+09:00
description: JComboBoxのComboBoxEditorにJLayerを設定し、そのテキストが空の場合はプレースホルダ文字列を表示します。
image: https://drive.google.com/uc?id=1tj1SR1p6B8munrw_eO-ktRIB0pyl4h2-kw
---
* 概要 [#summary]
`JComboBox`の`ComboBoxEditor`に`JLayer`を設定し、そのテキストが空の場合はプレースホルダ文字列を表示します。

#download(https://drive.google.com/uc?id=1tj1SR1p6B8munrw_eO-ktRIB0pyl4h2-kw)

* サンプルコード [#sourcecode]
#code(link){{
combo2.setEditor(new BasicComboBoxEditor() {
  private Component editorComponent;

  @Override public Component getEditorComponent() {
    editorComponent = Optional.ofNullable(editorComponent)
        .orElseGet(() -> {
          JTextComponent tc = (JTextComponent) super.getEditorComponent();
          return new JLayer<>(tc, new PlaceholderLayerUI<>("- Select type -"));
        });
    return editorComponent;
  }
});
combo2.setBorder(BorderFactory.createCompoundBorder(
    combo2.getBorder(), BorderFactory.createEmptyBorder(0, 2, 0, 0)));
    combo2.getBorder(),
    BorderFactory.createEmptyBorder(0, 2, 0, 0)));
}}

* 解説 [#explanation]
- 上:
-- デフォルトの編集可能な`JComboBox`
-- 編集可能な`JComboBox`の場合は、[[JComboBoxでアイテムが選択されていない場合のプレースホルダ文字列を設定する>Swing/ComboBoxPlaceholder]]のようにセルレンダラーを使用したプレースホルダ文字列の表示は不可
- 下:
-- 編集可能に設定した`JComboBox`にプレースホルダ文字列を表示する`JLayer`でラップした`JTextField`を生成する`ComboBoxEditor`を設定
-- `BasicComboBoxEditor#getEditorComponent()`はエディタとして`Component`を返すため`JLayer`でラップした`JTextField`を使用可能
--- `BasicComboBoxEditor#createEditorComponent()`は`JTextField`を返すため、こちらをオーバーライドする場合は[[JTextFieldにフォーカスと文字列が無い場合の表示>Swing/GhostText]]などのように`FocusListener`を使用する必要がある
-- `WindowsLookAndFeel`でエディタの内余白が適用されない場合がある?ため`JComboBox`本体の縁を変更
--- このため、他の`LookAndFeel`に切り替えると縁や内余白がおかしくなる

* 参考リンク [#reference]
- [[JComboBoxでアイテムが選択されていない場合のプレースホルダ文字列を設定する>Swing/ComboBoxPlaceholder]]
- [[ComboBoxEditorにJLayerを設定し入力の妥当性を表示する>Swing/ComboBoxEditorVerifier]]

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