当前位置: 首页 > 知识库问答 >
问题:

如何扩展TableRowSorter来只更改单个列的比较器,并超级处理其余的

公冶翰池
2023-03-14

嗨,我正在尝试使用一个自定义比较器,只用于JTable中的一个列。我已经用下面的代码完成了这一点。问题是这样做会破坏整数的适当排序。

我有一个JTable,其中的列类是:String Integer Integer Boolean Boolean

我用的比较器是这些。第一个使用了从如何在字母和数字之间(或者在数字和字母之间)拆分字符串?的拆分。

//compare strings being aware of numbers embedded in the string
private static Comparator<String> numberAwareCompare = new Comparator<String>() {
    public int compare(String s1, String s2) {

        String[] s1Parts = s1.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
        String[] s2Parts = s2.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");

        int i = 0;
        while(i < s1Parts.length && i < s2Parts.length){

            //if parts are the same
            if(s1Parts[i].compareTo(s2Parts[i]) == 0){
                ++i;
            }else{
                try{

                    int intS1 = Integer.parseInt(s1Parts[i]);
                    int intS2 = Integer.parseInt(s2Parts[i]);

                    //if the parse works

                    int diff = intS1 - intS2; 
                    if(diff == 0){
                        ++i;
                    }else{
                        return diff;
                    }
                }catch(Exception ex){
                    return s1.compareTo(s2);
                }
            }//end else
        }//end while

            //Handle if one string is a prefix of the other.
        if(s1.length() < s2.length()){
            return -1;
        }else if(s1.length() > s2.length()){
            return 1;
        }else{
            return 0;
        }

        return 0;
    }
};
public class FeatureRowSorter extends TableRowSorter<TableModel>{
    public FeatureRowSorter(TableModel tableModel) {
        super(tableModel);
        //setComparator(0, numberAwareCompare);
        //setComparator(1,intCompare);
        //setComparator(2,intCompare);
    }

    @Override
    public Comparator<?> getComparator(int column){
        if(column == 0){
            return numberAwareCompare;
        }else{
            return super.getComparator(column);
        }
    }
}

因此,我创建了一个简单的整数排序器,如下所示:

//Integer compare, need this to use the custom TableRowSorter
public static Comparator<Integer> intCompare = new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 - o2;
    }
};

现在我删除上面的getComparator方法,并明确地将比较器添加到正确的列中。(上面注释掉的代码)。这具有正确的排序行为。

我用下面的代码将行排序器添加到表中。我的模型创建了一个新的自定义行排序器,并将其发送到controller对象中的视图的JTable。

//In the model, FeatureTableModel extends DefaultTableModel,getClass method implemented correctly    
public FeatureRowSorter getFeatureRowSorter(){
        return new FeatureRowSorter(getFeatureTableModel());
    }

然后将排序器添加到表中,如下所示:

view.getFeatureTable().setRowSorter(model.getFeatureRowSorter());
@Override
    public Class<?> getColumnClass(int column){
        if(column == 4){
            return Boolean.class;
        }else if(column == 2){
            return Integer.class;
        }else{
            return Object.class;
        }
    }

我把这个改成:

@Override
    public Class<?> getColumnClass(int column){
        if(column == 4){
            return Boolean.class;
        }else if(column == 1 || column == 2){
            return Integer.class;
        }else{
            return Object.class;
        }
    }

共有1个答案

楚宪
2023-03-14

通过对TableRowSorter实例调用setComparator方法,在进行了一段快速测试之后,我获得了所需的结果。也就是说,我没有创建扩展TableRowSorter的自己的类。

JTable table = new JTable(model);

TableRowSorter<TableModel> rowSorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(rowSorter);

rowSorter.setComparator(0, new Comparator<String>() {
  @Override
  public int compare(String o1, String o2) {
    // etc.
  }

});

在我的测试中,这种方法对在同一表中排序一列整数的能力没有负面影响。

我明白这并不是你为什么会遇到问题的解释,但作为一种可能更简单的解决办法,它值得一试。

 类似资料:
  • 使用焊接1.1.13。最终在测试与Arquillian...... 假设我向一个字段注入了一些不稳定的东西。比如一个受更改影响的属性,我希望拥有注入点的bean接收更改事件。考虑创建一个CDI扩展。 捕获ProcessAnnotatedType事件并查找在字段注入点上具有自定义注释的所有字段: 之后,他甚至抓取了字段的所有注入点,并用对应于“包装器”类型的新字段替换了底层的WeldField。否则

  • 问题内容: 关于扩展django管理模板的一个(不是这样)快速问题。 我试图通过在结果行(row1和row2类)之间添加一个包含一些与该对象相关的对象的中间行来更改特定模型的结果列表(在django lingo中更改列表)。 我搜索了代码,但没有找到一种方法来执行此操作。非常感谢任何指针。代码也将有所帮助。 PS:我知道我应该设计自己的界面,但这是一个内部项目,我没有太多时间可以花时间。另外,dj

  • 很多批处理问题都可以通过单进程、单线程的工作模式来完成, 所以在想要做一个复杂设计和实现之前,请审查你是否真的需要那些超级复杂的实现。 衡量实际作业(job)的性能,看看最简单的实现是否能满足需求: 即便是最普通的硬件,也可以在一分钟内读写上百MB数据文件。 当你准备使用并行处理技术来实现批处理作业时,Spring Batch提供一系列选择,本章将对他们进行讲述,虽然某些功能不在本章中涵盖。从高层

  • 我有两个不同的DataFrame:A、B。column事件有相似的数据,我正在使用这些数据来比较这两个DataFrames。我想给Dataframe A一个新列dfa.newContext#。 为此,我需要使用Event列。我想遍历Dataframe A以找到事件的匹配项,并将dfb.context#分配给dfa.newcontext# 我认为循环是最好的方法,因为我有一些条件需要检查。 这可能要

  • 我正在开发一个Quarkus扩展,它提供了一个拦截器(及其注释),以围绕此扩展提供的业务方法添加一些重试逻辑。这里没有什么新内容,当我在使用此扩展的应用程序中注释bean的公共方法时,这是有效的。 但是该扩展还提供了一些也带注释的@ApplationScoped bean,但拦截器没有拦截其中任何一个。 似乎拦截器不会检查/应用扩展本身。 我想知道这是有意的行为,还是我的扩展设置中的问题,如果是,

  • 问题内容: 假设我有一个数组/要比较的事物列表。在我更熟悉的语言中,我会做类似的事情 这样可以确保我们只比较每对一次。在某些情况下,我正在对列表中包含的一堆对象进行碰撞检测。对于检测到的每个碰撞,将一个描述碰撞的小的“碰撞”对象添加到列表中,然后另一个例程循环循环以解决每个碰撞(取决于两个碰撞对象的性质)。显然,我只想报告每个碰撞一次。 现在,这样做的pythonic方式是什么,因为Python倾