java - 问题子类化 JTextField : initial text value is not displayed

标签 java swing jtextfield

我需要一个只接受正整数作为输入的 JTextField。我的实现大部分都有效。当您在字段中键入文本时,会出现数字,而不会出现非数字。

但是构造函数的“text”参数有问题。如果我传递一个包含正整数的字符串表示形式的字符串,我希望文本字段开始时包含该字段,但文本字段开始时为空白。例如,这样做会导致它表现出我所描述的症状:new NumericTextField("1", 5);

在初始化期间不会调用覆盖的 insertString 方法。

我做错了什么,我该如何解决?这是代码...

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;


/**
  * A JTextField that only accepts characters that are digits. Also, the first character can't be "0".
 */
public class NumericTextField extends JTextField {

    public class CustomFilterDocument extends PlainDocument {
        public void insertString(int offset, String text, AttributeSet aset) throws BadLocationException {
            if (isLegalValue(text)) {
                super.insertString(offset, text, aset);
            }
        }
    }

    private static boolean isLegalValue(String text) {
        if (text == null) {
            return false;
        }

        int len = text.length();
        for (int i = 0; i < len; i++) {
            char c = text.charAt(i);
            if (!Character.isDigit(c) || (i ==0 && c == '0')) {
                return false;
            }
        }

        return true;
    }

    public NumericTextField() {
        super();
        setDocument(new CustomFilterDocument());
    }

    public NumericTextField(int columns) {
        super(columns);
        setDocument(new CustomFilterDocument());
    }

    public NumericTextField(String text) {
        super(text);
        setDocument(new CustomFilterDocument());
    }

    public NumericTextField(String text, int columns) {
        super(text, columns);
        setDocument(new CustomFilterDocument());
    }
}

固定版本(使用我从响应中学到的)如下所示:

public NumericTextField(String text) {
    super(text);
    initText(text);
}

public NumericTextField(String text, int columns) {
    super(text, columns);
    initText(text);
}

private void initText(String text) {
    Document doc = new CustomFilterDocument();
    try {
        doc.insertString(0, text, null);
    } catch (BadLocationException ble) {
    }
    setDocument(doc);
}

最佳答案

问题是您将文档设置为新文档。这将清除您通过构造函数传入的所有内容。

public NumericTextField(String text) {
    super(text);
    // This next line will erase the content on the current document
    setDocument(new CustomFilterDocument());
}

关于java - 问题子类化 JTextField : initial text value is not displayed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3663586/

相关文章:

Java GridLayout 将我所有的 JPanel 布局在左上角

java - 将 JTextArea 内容写入文件

java - 读取 ArrayList JTextFields

java - android studio中volley库无法发送请求

java - Selenium Webdriver 测试用例 - 测试用例未按顺序执行

java - JToolBar 中的 JSeperator 将组件移动到右端

Java JMenu 和 Jtextfield 只处理数字而不处理字符串

java - KeyListener 的正确使用方法是什么?

java - vaadin 响应不能正常工作

java - JCombobox getSelectedItem() 导致 JTable 中失去焦点