Swing/ComboBoxPlaceholder のバックアップの現在との差分(No.9)
- category: swing folder: ComboBoxPlaceholder title: JComboBoxでアイテムが選択されていない場合のプレースホルダ文字列を設定する tags: [JComboBox, ListCellRenderer] author: aterai pubdate: 2017-05-01T14:53:34+09:00 description: JComboBoxでアイテムが選択されていない場合、代わりに表示するプレースホルダ文字列を設定します。 image: https://drive.google.com/uc?id=1R3IHJMxqNMm4oHGv9wmZ8FXpeZJn0AvEwA
概要
JComboBox
でアイテムが選択されていない場合、代わりに表示するプレースホルダ文字列を設定します。
Screenshot
Advertisement
サンプルコード
JComboBox<String> combo1 = new JComboBox<>(
new String[] {"One", "Two", "Three", "Four"});
combo1.setSelectedIndex(-1);
combo1.setRenderer(new DefaultListCellRenderer() {
@Override public Component getListCellRendererComponent(
JList<?> list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
// XXX: String str = index < 0 ? "- Select Item -" : value.toString();
// ???: String str = index < 0 ? "- Select Item -" : value.toString();
String str = Objects.toString(value, "- Select Item -");
super.getListCellRendererComponent(
list, str, index, isSelected, cellHasFocus);
return this;
}
});
View in GitHub: Java, Kotlin解説
上記のサンプルでは、編集不可のJComboBox
にアイテムが選択されていない場合はヒント文字列を表示するリストセルレンダラーを設定しています。
上記のサンプルでは、編集不可のJComboBox
にアイテムが選択されていない場合にヒントとしてプレースホルダ文字列を表示するリストセルレンダラーを設定しています。
- リストセルレンダラーは、
DefaultListCellRenderer#getListCellRendererComponent(...)
メソッドをオーバーライドし、引数のvalue
がnull
の場合のみヒント文字列を表示するコンポーネントを返すよう設定 - リストセルレンダラーでヒント文字列を表示しているだけなので、
JComboBox
のモデル自体にそれを含める必要がない - 注: 引数の
Object value
がnull
の場合ではなく、int index
が-1
の場合にプレースホルダ文字列を表示するように設定すると、選択が変更できなくなる? -
DefaultListCellRenderer#getListCellRendererComponent(...)
メソッドをオーバーライドし、引数のvalue
がnull
である場合のみヒント文字列を表示するよう設定- 引数の
Object value
がnull
の場合ではなくリストのindex
が-1
の場合にヒント文字列を表示すると、マウスクリックでJComboBox
の選択状態が変更不可になる?
- 引数の
- リストセルレンダラー側でプレースホルダ文字列を表示しているため
JComboBox
のモデル側にプレースホルダ文字列を含める必要がない
参考リンク
- JTextFieldにフォーカスと文字列が無い場合の表示
- JTextFieldに透かし画像を表示する
- JPasswordFieldにヒント文字列を描画する
- ComboBoxEditorにJLayerを設定してプレースホルダ文字列を表示する
- こちらは編集可能な
JComboBox
でプレースホルダ文字列を表示する場合のサンプル
- こちらは編集可能な