JCombobox只接受字母

时间:2015-09-14 13:52:48

标签: java swing

如何创建一个只接受字母长度为3的组合框? 我创建了一个自动完成组合框,将editable设置为true。 现在我想让用户只输入长度为3的字母到组合框的输入字段。有什么想法吗?

我将此文档过滤器添加到Jcombobox的文本字段中。

class AlphaDocumentFilter extends DocumentFilter {

  private final static Pattern CHARACTERS = Pattern.compile("[a-zA-Z]");

      public void insertString(DocumentFilter.FilterBypass fb, int offset, String text,
          AttributeSet attr) throws BadLocationException {
        if (text != null && CHARACTERS.matcher(text).matches() && (fb.getDocument().getLength() + text.length()) <= 3){
          fb.insertString(offset, text.toUpperCase(), attr);
        }

      }

      public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text,
          AttributeSet attrs) throws BadLocationException {
        if (text != null && CHARACTERS.matcher(text).matches() && (fb.getDocument().getLength() + text.length() - length) <= 3){
          fb.replace(offset, length, text.toUpperCase(), attrs);
        }

      }
    }

如果我在组合框中输入值,它会起作用。但是当我选择项目时,它没有显示在组合框中,因为过滤器提示允许它。

例如,如果我在组合框编辑器中输入EUR,则可以。但如果我从项目中选择EUR它不起作用意味着过滤器不允许它在编辑器中显示。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

您需要访问组合框的编辑器,以便过滤字符。组合框的默认编辑器是文本字段。您可以使用以下方式访问文本字段:

ComboBoxEditor editor = comboBox.getEditor();
JTextField textField = (JTextField)editor.getEditorComponent();

过滤字符的最佳方法是在文本字段的DocumentFilter上使用Document。阅读Implementing a DocumentFilter上的Swing教程中的部分。本教程包含一个工作过滤器,用于限制可输入的字符数。

您需要修改过滤器以仅允许使用字母字符。请注意,您需要修改replace()insertString()方法,因为这些方法中的任何一种都可能用于向Document添加文字。

编辑:

阅读How to Use Combo Boxes上的Swing教程中的部分。有一个使用可编辑组合框的示例。请注意该部分中的评论:

当用户从菜单中选择项目并且用户键入Enter时,可编辑的组合框会触发操作事件。请注意,当用户在组合框中输入值时,菜单保持不变。如果需要,您可以轻松编写一个动作侦听器,每次用户键入唯一值时,都会在组合框的菜单中添加新项目。