Java RowFilter.NumberFilter:can';“t手柄”;混合;具体数字类型

Java RowFilter.NumberFilter:can';“t手柄”;混合;具体数字类型,java,swing,numbers,compare,rowfilter,Java,Swing,Numbers,Compare,Rowfilter,如果至少有一个值(值==行筛选器中的值,条目中的值)是十进制,则发生此情况。下面是一个失败的测试: @Test public void testRowFilterNumberMixCore() { TestEntry entry = new TestEntry(1.2f); RowFilter filter = RowFilter.numberFilter(ComparisonType.AFTER, 1, 0); assertTrue(entry + "must be i

如果至少有一个值(值==行筛选器中的值,条目中的值)是十进制,则发生此情况。下面是一个失败的测试:

@Test
public void testRowFilterNumberMixCore() {
    TestEntry entry = new TestEntry(1.2f);
    RowFilter filter = RowFilter.numberFilter(ComparisonType.AFTER, 1, 0);
    assertTrue(entry + "must be included " + filter, filter.include(entry));
}
输出为:

junit.framework.AssertionFailedError: [entry: 1.2] must be included [RowFilter: ComparisonType = AFTER, comparableValue: 1, comparableClass: class java.lang.Integer] 这样做,使测试通过-我有点担心隐藏的(读:未知的我:)陷阱。欢迎任何警告/替代方案

供参考:交叉过账至

跟进


如上所述实施,现在等待客户投诉-在这种情况下,将指向所有没有在此处警告我的人:-)

我没有更好的答案,但下面的示例说明了效果。具体而言,基于
double
原语的
RowFilter
double
,生成具有
值>1
的预期表格。相反,基于
float
的一个被装箱为
float
。由于类文本不匹配,
include()
比较
long
值,意外地过滤所有分数
值<2

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.util.Arrays;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.RowFilter;
import javax.swing.RowFilter.ComparisonType;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableRowSorter;

/** @see http://stackoverflow.com/questions/7993546 */
public class FilterTest {

    private static TableRowSorter<TableModel> sorter;
    private static RowFilter<TableModel, Integer> dFilter;
    private static RowFilter<TableModel, Integer> fFilter;
    private static boolean b;

    public static void main(String[] args) {
        TableModel model = new TableModel();
        JTable table = new JTable(model);
        sorter = new TableRowSorter<TableModel>(model);
        dFilter = RowFilter.numberFilter(ComparisonType.AFTER, 1d, 0);
        fFilter = RowFilter.numberFilter(ComparisonType.AFTER, 1f, 0);
        sorter.setRowFilter(dFilter);
        table.setRowSorter(sorter);
        JScrollPane scrollPane = new JScrollPane(table);
        table.setPreferredScrollableViewportSize(new Dimension(320, 240));

        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(scrollPane, BorderLayout.CENTER);
        f.add(new JToggleButton(new AbstractAction("Toggle") {

            @Override
            public void actionPerformed(ActionEvent e) {
                b = !b;
                if (b) {
                    sorter.setRowFilter(fFilter);
                } else {
                    sorter.setRowFilter(dFilter);
                }
            }
        }), BorderLayout.SOUTH);

        f.pack();
        f.setVisible(true);
    }

    private static class TableModel extends AbstractTableModel {

        private static final int ROWS = 16;
        private static final int COLS = 4;
        private Double[][] matrix = new Double[ROWS][COLS];

        public TableModel() {
            double v = 0;
            for (Object[] row : matrix) {
                Arrays.fill(row, Double.valueOf(v += 0.25));
            }
        }

        @Override
        public int getRowCount() {
            return ROWS;
        }

        @Override
        public int getColumnCount() {
            return COLS;
        }

        @Override
        public Object getValueAt(int row, int col) {
            return matrix[row][col];
        }

        @Override
        public Class<?> getColumnClass(int col) {
            return Number.class;
        }
    }
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.event.ActionEvent;
导入java.util.array;
导入javax.swing.AbstractAction;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.JToggleButton;
导入javax.swing.RowFilter;
导入javax.swing.RowFilter.ComparisonType;
导入javax.swing.table.AbstractTableModel;
导入javax.swing.table.TableRowSorter;
/**@见http://stackoverflow.com/questions/7993546 */
公共类过滤器测试{
专用静态桌面分拣机;
专用静态行过滤器;
专用静态行过滤器;
私有静态布尔b;
公共静态void main(字符串[]args){
TableModel模型=新的TableModel();
JTable table=新的JTable(模型);
分拣机=新的表格行分拣机(型号);
dFilter=RowFilter.numberFilter(ComparisonType.AFTER,1d,0);
fFilter=RowFilter.numberFilter(ComparisonType.AFTER,1f,0);
分拣机。setRowFilter(dFilter);
表.SetRow分拣机(分拣机);
JScrollPane scrollPane=新的JScrollPane(表);
table.setPreferredScrollableViewportSize(新维度(320240));
JFrame f=新JFrame(“测试”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 添加(滚动窗格,BorderLayout.CENTER);
f、 添加(新的JToggleButton(新的抽象动作(“切换”){
@凌驾
已执行的公共无效操作(操作事件e){
b=!b;
如果(b){
分拣机。setRowFilter(fFilter);
}否则{
分拣机。setRowFilter(dFilter);
}
}
}),边界布局(南部);
f、 包装();
f、 setVisible(真);
}
私有静态类TableModel扩展了AbstractTableModel{
私有静态最终整数行=16;
专用静态最终int COLS=4;
私有双精度[][]矩阵=新双精度[行][COLS];
公共表格模型(){
双v=0;
对于(对象[]行:矩阵){
数组填充(行,双精度.valueOf(v+=0.25));
}
}
@凌驾
public int getRowCount(){
返回行;
}
@凌驾
public int getColumnCount(){
返回COLS;
}
@凌驾
公共对象getValueAt(整数行,整数列){
返回矩阵[行][col];
}
@凌驾
公共类getColumnClass(int-col){
返回编号.class;
}
}
}

我没有更好的答案,但下面的示例说明了效果。具体而言,基于
double
原语的
RowFilter
double
,生成具有
值>1
的预期表格。相反,基于
float
的一个被装箱为
float
。由于类文本不匹配,
include()
比较
long
值,意外地过滤所有分数
值<2

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.util.Arrays;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.RowFilter;
import javax.swing.RowFilter.ComparisonType;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableRowSorter;

/** @see http://stackoverflow.com/questions/7993546 */
public class FilterTest {

    private static TableRowSorter<TableModel> sorter;
    private static RowFilter<TableModel, Integer> dFilter;
    private static RowFilter<TableModel, Integer> fFilter;
    private static boolean b;

    public static void main(String[] args) {
        TableModel model = new TableModel();
        JTable table = new JTable(model);
        sorter = new TableRowSorter<TableModel>(model);
        dFilter = RowFilter.numberFilter(ComparisonType.AFTER, 1d, 0);
        fFilter = RowFilter.numberFilter(ComparisonType.AFTER, 1f, 0);
        sorter.setRowFilter(dFilter);
        table.setRowSorter(sorter);
        JScrollPane scrollPane = new JScrollPane(table);
        table.setPreferredScrollableViewportSize(new Dimension(320, 240));

        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(scrollPane, BorderLayout.CENTER);
        f.add(new JToggleButton(new AbstractAction("Toggle") {

            @Override
            public void actionPerformed(ActionEvent e) {
                b = !b;
                if (b) {
                    sorter.setRowFilter(fFilter);
                } else {
                    sorter.setRowFilter(dFilter);
                }
            }
        }), BorderLayout.SOUTH);

        f.pack();
        f.setVisible(true);
    }

    private static class TableModel extends AbstractTableModel {

        private static final int ROWS = 16;
        private static final int COLS = 4;
        private Double[][] matrix = new Double[ROWS][COLS];

        public TableModel() {
            double v = 0;
            for (Object[] row : matrix) {
                Arrays.fill(row, Double.valueOf(v += 0.25));
            }
        }

        @Override
        public int getRowCount() {
            return ROWS;
        }

        @Override
        public int getColumnCount() {
            return COLS;
        }

        @Override
        public Object getValueAt(int row, int col) {
            return matrix[row][col];
        }

        @Override
        public Class<?> getColumnClass(int col) {
            return Number.class;
        }
    }
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.event.ActionEvent;
导入java.util.array;
导入javax.swing.AbstractAction;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.JToggleButton;
导入javax.swing.RowFilter;
导入javax.swing.RowFilter.ComparisonType;
导入javax.swing.table.AbstractTableModel;
导入javax.swing.table.TableRowSorter;
/**@见http://stackoverflow.com/questions/7993546 */
公共类过滤器测试{
专用静态桌面分拣机;
专用静态行过滤器;
专用静态行过滤器;
私有静态布尔b;
公共静态void main(字符串[]args){
TableModel模型=新的TableModel();
JTable table=新的JTable(模型);
分拣机=新的表格行分拣机(型号);
dFilter=RowFilter.numberFilter(ComparisonType.AFTER,1d,0);
fFilter=RowFilter.numberFilter(ComparisonType.AFTER,1f,0);
分拣机。setRowFilter(dFilter);
表.SetRow分拣机(分拣机);
JScrollPane scrollPane=新的JScrollPane(表);
table.setPreferredScrollableViewportSize(新维度(320240));
JFrame f=新JFrame(“测试”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 添加(滚动窗格,BorderLayout.CENTER);
f、 添加(新的JToggleButton(新的抽象动作(“切换”){
@凌驾
已执行的公共无效操作(操作事件e){
b=!b;
如果(b){
分拣机。setRowFilter(fFilter);
}否则{
分拣机。setRowFilter(dFilter);
}
}
}),边界布局(南部);
f、 包装();
f、 setVisible(真);
}
私有静态类TableModel扩展了Ab