アプリケーションにテキスト フィールドがあります。テキスト フィールドであるにもかかわらず、ユーザーは大量のテキストを貼り付けることがあります。さらに、問題の他の関数も大量に設定されます。
テキストが多すぎて、JVM が fontmanager.dll でアクセス違反を起こすことがあります。オラクルは問題自体の修正に関心を持っていないようですので、少なくとも回避したいと思います。
ユーザーが入力するテキストの量を制限することは明らかに受け入れられません (そうでなければ、これが最も明白な解決策です) が、設定を許可してからテキスト フィールドを無効にすることは受け入れられます。テキストがモデルにバインドされると、テキスト全体が再び含まれる必要があります。
これは本質的にビューのバグであるため、モデルで回避してそこに追加のプロパティを追加するのではなく、ビューで修正する必要があると考えました。
私の最初の試みは次のようなものでした:
public class LimitedTextField extends JTextField {
static final int LIMIT = 10000;
private String fullString;
@Override
public void setText(String text) {
if (text != null && text.length() > LIMIT) {
fullString = text;
setEnabled(false);
} else {
fullString = null;
super.setText(text);
setEnabled(true);
}
}
@Override
public String getText() {
if (fullString != null) {
return fullString;
} else {
return super.getText();
}
}
}
これは単純な単体テストに合格しますが、BeansBinding の追加テストを作成したところ、BeansBinding はテキスト プロパティにバインドされず、ドキュメントにバインドされ、テキスト プロパティをシミュレートするため、機能しないことがわかりました。したがって、実際には getText() はそのテストで常に空の文字列を返します。
私は今、私が望むことを行う Document 実装を作成しようとしていますが、ドキュメントレベルでこの種のトリックを行うのは確かに簡単ではありません. 私はそれが持っているすべてのメソッドを見ることができますが、getText() を呼び出すときにそのテキストを使用できないようにせずにテキストを制限する良い方法を見つけることができません。