ComboBoxEditorにJLayerを設定し入力の妥当性を表示する
Total: 3508
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JComboBox
のComboBoxEditor
にJLayer
を設定し、その入力が妥当でない場合はアイコンを表示します。
Screenshot
Advertisement
サンプルコード
comboBox.setEditable(true);
comboBox.setInputVerifier(new LengthInputVerifier());
comboBox.setEditor(new BasicComboBoxEditor() {
private Component editorVerifier;
@Override public Component getEditorComponent() {
if (editorVerifier == null) {
JTextComponent tc = (JTextComponent) super.getEditorComponent();
editorVerifier = new JLayer<JTextComponent>(tc, new ValidationLayerUI());
}
return editorVerifier;
}
});
View in GitHub: Java, Kotlin解説
6
文字以上入力すると赤い×
アイコンを表示するLayerUI
を作成- アイコンはHow to Decorate Components with the JLayer Class (The Java™ Tutorials > Creating a GUI With Swing > Using Other Swing Features)から引用
- 入力の妥当性の検証自体は
JComboBox
に設定したInputVerifier
を使用
JComboBox
にBasicComboBoxEditor#getEditorComponent()
をオーバーライドしてエディタコンポーネントをJLayer
(上記のLayerUI
を使用する)に変更したComboBoxEditor
を設定BasicComboBoxEditor#createEditorComponent()
をオーバーライドすることでエディタのJTextField
にJLayer
をする場合は、BasicComboBoxEditor#getItem()
などのメソッドも修正するf.setName("ComboBox.textField");
とエディタに名前を設定しておくとNimbusLookAndFeel
などでフォーカス時のBorder
が正しく描画される
- Enterキーで
JComboBox
に編集中の文字列をアイテム追加する場合もInputVerifier
で検証するように設定
JComboBox<String> comboBox = new JComboBox<String>(model) {
@Override public void updateUI() {
super.updateUI();
final JComboBox<String> cb = this;
getActionMap().put("enterPressed", new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
if (getInputVerifier().verify(cb)) {
String str = Objects.toString(getEditor().getItem(), "");
DefaultComboBoxModel<String> m =
(DefaultComboBoxModel<String>) getModel();
m.removeElement(str);
m.insertElementAt(str, 0);
if (m.getSize() > 10) {
m.removeElementAt(10);
}
setSelectedIndex(0);
}
}
});
}
};
参考リンク
JLayerを使用したコンポーネントのデコレート方法- How to Decorate Components with the JLayer Class (The Java™ Tutorials > Creating a GUI With Swing > Using Other Swing Features)