Swing/ComboEditorPlaceholder の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/ComboEditorPlaceholder へ行く。
- Swing/ComboEditorPlaceholder の差分を削除
--- 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