Java 范围的通用输入验证器

Java 范围的通用输入验证器,java,swing,validation,java-7,inputverifier,Java,Swing,Validation,Java 7,Inputverifier,我试图创建一个通用的InputVerifier来检查JComponent中的数据是否在指定的范围内。为此,我将泛型类型扩展为可比较的,以确保它可以进行比较 我关注的是以下两件事: JComponent没有getText()方法,也没有可转换的子类,这些子类由JTextField和JSpinner等常见组件使用,它们都有各自不同的获取值的方法 我认为我不能指定我的泛型类型数据类型必须具有特定的函数签名。我试图看看是否可以强制它有一个接受单个字符串的构造函数(比如Integer、Double、Flo

我试图创建一个通用的InputVerifier来检查JComponent中的数据是否在指定的范围内。为此,我将泛型类型扩展为可比较的,以确保它可以进行比较

我关注的是以下两件事:

  • JComponent没有getText()方法,也没有可转换的子类,这些子类由JTextField和JSpinner等常见组件使用,它们都有各自不同的获取值的方法
  • 我认为我不能指定我的泛型类型数据类型必须具有特定的函数签名。我试图看看是否可以强制它有一个接受单个字符串的构造函数(比如Integer、Double、Float do),或者强制数据类型必须扩展Integer、Double或Float,但我不确定这是否适用于Java 7泛型。如果我能做一些类似的事情,那就太好了:
    datatypemydata=newdatatype(text)
  • 这是我现在上的课。我将其抽象化,因此子类必须知道返回文本所涉及的JComponent的类型,然后如何构建可比较的类型以进行比较。考虑到不同类型的JComponent和可能使用的类似类型,这可能会导致许多排列。有没有办法消除我上面提到的一个或两个问题

    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);
    
    }
    
    import javax.swing.InputVerifier;
    导入javax.swing.JComponent;
    公共抽象类InputRangeVerifier扩展了InputVerifier{
    私有数据类型m_min;
    私有数据类型m_max;
    公共InputRangeVerifier(数据类型最小,数据类型最大){
    m_min=min;
    m_max=max;
    }
    @凌驾
    公共布尔验证(JComponent组件){
    String componentText=getComponentText();
    DataType Compariable=GetCompariableValue(componentText);
    布尔值greaterThanOrEqualToMin=可比。与(m_min)>0相比;
    布尔值lessThanOrEqualToMax=可比。比较到(m_max)<0;
    布尔值isInRange=greaterThanOrEqualToMin&lessThanOrEqualToMax;
    返回isInRange;
    }
    公共抽象字符串getComponentText();
    公共抽象数据类型getComparableValue(字符串文本);
    }
    
    我认为您必须重载所有基本数据类型,例如整数、双精度、日期、字符串、布尔值,否则我无法比较字符串形式的数字或日期实例,或者我错了吗???请查看BoundedRangeModel@mKorbel,BoundedRangeModel仅处理整数。另请参见。