0

そのため、入力に時間がかかるJTextFieldのTextValueChangedハンドラーを作成しています。ユーザーが0からLong.MAXまでの有効な値を入力できるようにする必要があります。ユーザーが無効な文字を入力した場合は、それを削除して、JTextFieldの値が常に有効な長さになるようにする必要があります。

私の現在のコードはこのように見えますが、見苦しいようです。外部ライブラリ(Apache Commonsを含む)がない場合、これを行うためのよりクリーンで簡単な方法はありますか?

public void textValueChanged(TextEvent e) {
    if (e.getSource() instanceof JTextField) {
        String text = ((JTextField) e.getSource()).getText();
        try {
            // Try to parse cleanly
            long longNum = Long.parseLong(text);
            // Check for < 1 
            if (longNum < 1) throw new NumberFormatException();
            // If we pass, set the value and return
            setOption("FIELDKEY", longNum);
        } catch (NumberFormatException e1) {
            // We failed, so there's either a non-numeric or it's too large.
            String s = ((JTextField) e.getSource()).getText();
            // Strip non-numeric characters
            s = s.replaceAll("[^\\d]", "");
            long longNum = -1;
            if (s.length() != 0) {
                /* Really ugly workaround for the fact that a
                 * TextValueChanged event can capture more than one
                 * keystroke at a time, if it's typed fast enough,
                 * so we might have to strip more than one
                 * character. */
                Exception e3;
                do {
                    e3 = null;
                    try {
                        // Try and parse again
                        longNum = Long.parseLong(s);
                    } catch (NumberFormatException e2) {
                        // We failed, so it's too large.
                        e3 = e2;
                        // Strip the last character and try again.
                        s = s.substring(0, s.length() - 1);
                    }
                    // Repeat
                } while (e3 != null);
            }
            // We parsed, so add it (or blank it if it's < 1) and return.
            setOption("FIELDKEY", (longNum < 1 ? 0 : longNum));
        }
    }
}

フィールドはgetOption(key)呼び出しから常に再入力されるため、値を「保存」するには、その呼び出しに渡すだけです。

4

3 に答える 3

6

DocumentFilterは、あなたのケースに適したソリューションです。

JohnZukowskiによるJavaSwingの決定的なガイドには、整数範囲を制限するためのカスタムドキュメントフィルターを示す542〜546ページの優れた例があります。

カスタムDocumentFilterを提供すると、コメントの1つで指定したように、コピー/一時停止時に不要な文字を削除するという要件に簡単に対応できます。

于 2012-04-17T18:54:25.993 に答える
2

フォーカスサブシステムの使用方法:入力の検証InputVerifierで説明されているも考慮してください。

于 2012-04-17T19:53:56.263 に答える
0

長く使えるフロート用に持っています

class DoubleTextDocument extends PlainDocument {
    public void insertString(int offs, String str, AttributeSet a)
            throws BadLocationException {
        if (str == null)
            return;
        String oldString = getText(0, getLength());
        String newString = oldString.substring(0, offs) + str
                + oldString.substring(offs);
        try {
            Float.parseFloat(newString + "0");
            super.insertString(offs, str, a);
        } catch (NumberFormatException e) {
        }
    }
}

そしてあなたの拡張でJTextFieldあなたは使うことができます

@Override

protected Document createDefaultModel() {
    return new DoubleTextDocument();
}
于 2012-04-17T18:29:32.597 に答える