首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义TableRowSorter -新排序顺序

自定义TableRowSorter -新排序顺序
EN

Code Review用户
提问于 2016-11-25 09:30:03
回答 1查看 1.9K关注 0票数 1

这个自定义TableRowSorter的目的是为我提供不同的列排序顺序。将排序顺序更改为

SortOrder.UNSORTED => SortOrder.ASCENDING => SortOrder.DESCENDING => SortOrder.ASCENDING => SortOrder.DESCENDING => .

SortOrder.UNSORTED => SortOrder.ASCENDING => SortOrder.DESCENDING =>SortOrder.UNSORTED => SortOrder.ASCENDING => SortOrder.DESCENDING => .

程序中有变量来自动继续排序顺序,即使列中有一个初始的排序键,它即将排序,就像下面的示例实现一样。

我想知道你是否认为这个程序能做它想要做的事情。我特别感兴趣的是你对该计划的效率的想法,以及是否可以对其进行任何改进。

ADU_SortOrder.java

代码语言:javascript
复制
package order;

import java.util.ArrayList;
import java.util.List;

import javax.swing.SortOrder;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class ADU_SortOrder<M extends TableModel> extends TableRowSorter<M> {
    public ADU_SortOrder(M model) {
        setModel(model);
    }

    boolean firstTime = true; //Needed in case there are any initial sort keys
    int columnHolder = -1;

    @Override
    public void toggleSortOrder(int column) {
        List<? extends SortKey> sortKeys = getSortKeys();
        if(sortKeys.size() == 0) { //For if there are no initial sort keys
            List<SortKey> keys = new ArrayList<SortKey>();
            keys.add(new SortKey(column, SortOrder.ASCENDING));
            setSortKeys(keys);
            return;
        }

        if (sortKeys.size() > 0 && columnHolder == column || firstTime) {
            if(firstTime) {
                firstTime = false;
                columnHolder = column;
                if(column != sortKeys.get(0).getColumn()) {
                    List<SortKey> keys = new ArrayList<SortKey>(getSortKeys());
                    keys.set(0, new SortKey(column, SortOrder.ASCENDING));
                    setSortKeys(keys);
                    return;
                }
            }

            List<SortKey> keys = new ArrayList<SortKey>(getSortKeys());
            keys.set(0, new SortKey(column, setNextOrder(sortKeys.get(0).getSortOrder())));
            setSortKeys(keys);
            return;
        } else if(sortKeys.size() > 0 && columnHolder != column && !firstTime) {
            List<SortKey> keys = new ArrayList<SortKey>(getSortKeys());
            keys.set(0, new SortKey(column, SortOrder.ASCENDING));
            setSortKeys(keys);
            columnHolder = column;
            return;
        }
        super.toggleSortOrder(column);
    }

    private SortOrder setNextOrder(SortOrder order) {
        switch (order) {
            case ASCENDING:
                return SortOrder.DESCENDING;
            case DESCENDING:
                return SortOrder.UNSORTED;
            case UNSORTED:
                return SortOrder.ASCENDING;
            default:
                return SortOrder.UNSORTED;
        }
    }
}

JTableTest.java

示例实现

代码语言:javascript
复制
import java.awt.GridLayout;

import java.util.List;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableModel;
import javax.swing.RowSorter;
import javax.swing.SortOrder;

import order.ADU_SortOrder;

@SuppressWarnings("serial")
public class JTableTest extends JFrame {
    private JTableTest() {
        super("JTable Test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new GridLayout(1, 1));
        createPanel();
        pack();
        setVisible(true);
    }

    JPanel panel = new JPanel(new GridLayout(1, 1));
    JScrollPane scroll;

    private void createPanel() {
        Object[] headers = {"Select", "Title", "Artist", "Length", "Title"};
        Object[][] sampleData = {{true, "Bat Outta Hell", "Meat Loaf", "673", "Bat Outta Hell"},
                {false, "Spanish Train", "Chris De Burgh", "358", "Spanish Train"},
                {true, "Bat Outta Hell", "Meat Loaf", "673", "Bat Outta Hell"}};
        JTable table = new JTable(sampleData, headers);

        //Sort Order Part
        ADU_SortOrder<TableModel> sortOrder = new ADU_SortOrder<TableModel>(table.getModel());
        List<RowSorter.SortKey> sortKeys = new ArrayList<>();
        sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
        sortOrder.setSortKeys(sortKeys);
        table.setRowSorter(sortOrder);

        scroll = new JScrollPane(table);
        panel.add(scroll);
        getContentPane().add(panel);
    }

    public static void main(String[] args) {
        new JTableTest();
    }
}

欢迎并赞赏任何其他意见、建议或建议。

EN

回答 1

Code Review用户

回答已采纳

发布于 2016-11-25 23:46:56

if(sortKeys.size() == 0) { //For if there are no initial sort keys

写起来更规范

代码语言:javascript
复制
        if (sortKeys.isEmpty()) {

而且,要么size为0,要么大于0。没有其他选择。因此,您不需要检查size是否大于0。如果没有从这个块中提取return,则size必须大于0。所以你不需要检查。

if (sortKeys.size() > 0 && columnHolder == column || firstTime) {

} else if(sortKeys.size() > 0 && columnHolder != column && !firstTime) {

如果我们放弃size检查,这些可能只是

代码语言:javascript
复制
        if (columnHolder == column || firstTime) {

代码语言:javascript
复制
        } else {

super.toggleSortOrder(column);

是不必要的。在达到这个目标之前,您总是return

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/148073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档