JComponent 内のデータが指定された範囲内にあるかどうかを確認する汎用 InputVerifier を作成しようとしています。このために、ジェネリック型を Comparable<> に拡張して、比較できるようにしました。
私が引っかかっているのは、次の2つのことです。
- JComponent には getText() メソッドがありません。また、JTextField や JSpinner などの一般的なコンポーネントで使用されるキャスト先のサブクラスもありません。これらのコンポーネントには、それぞれ値を取得するための異なるメソッドがあります。
- ジェネリック型 DataType に特定の関数シグネチャが必要であると指定できるとは思いません。単一の文字列(Integer、Double、Floatのように)を受け取るコンストラクターがあることを強制できるかどうか、またはDataTypeがInteger、Double、またはFloatのいずれかを拡張する必要があることを強制できるかどうかを確認しようとしていましたが、よくわかりませんこれが Java 7 Generics で可能な場合。次のようなことができれば素晴らしいと思います:
DataType myData = new DataType(text);
これが私が今持っているクラスです。抽象化したので、サブクラスは、テキストを返すために関係する JComponent の型を認識し、比較のために比較可能な型を構築する方法を知る必要があります。これにより、さまざまなタイプの JComponents および Comparable タイプが使用される可能性があるため、多くの順列が発生する可能性があります。上記の問題の 1 つまたは両方を解消する方法はありますか?
import javax.swing.InputVerifier;
import javax.swing.JComponent;
public abstract class InputRangeVerifier<DataType extends Comparable<DataType>> extends InputVerifier {
private DataType m_min;
private DataType m_max;
public InputRangeVerifier(DataType min, DataType max) {
m_min = min;
m_max = max;
}
@Override
public boolean verify(JComponent component) {
String componentText = getComponentText();
DataType comparable = getComparableValue(componentText);
boolean greaterThanOrEqualToMin = comparable.compareTo(m_min) > 0;
boolean lessThanOrEqualToMax = comparable.compareTo(m_max) < 0;
boolean isInRange = greaterThanOrEqualToMin && lessThanOrEqualToMax;
return isInRange;
}
public abstract String getComponentText();
public abstract DataType getComparableValue(String text);
}