Сортировка JTable по скрытому столбцу - PullRequest
2 голосов
/ 04 августа 2011

Я хотел бы отсортировать JTable строк на основе одного скрытого столбца.

Скажем, у меня есть JTable, подобный этому

column1   column2
val1       val2

Теперь у меня есть еще один столбец3, который скрыти я не хочу показывать.Когда пользователь нажимает на Column2, он должен сортировать строки на основе Column3 (скрытый столбец), а не на основе Column2.

Как этого добиться в JTable?

Ответы [ 3 ]

3 голосов
/ 04 августа 2011

Используйте код, размещенный здесь: http://www.esus.com/docs/GetQuestionPage.jsp?uid=1270

есть аргумент переменной / метода col - просто проверьте, является ли он вашим столбцом2 и, если это так, относитесь к нему, как к скрытому столбцу, - сортируйте его и переопределяйте таблицу.

2 голосов
/ 04 августа 2011

Одним из подходов является реализация интерфейса Comparable для типа Column2, как показано в этом примере , и сравнение с использованием соответствующего значения Column3.Удобно, если Column3 уже реализует Comparable<Column3>, вы можете просто делегировать Column3, как пример делает с Double.

2 голосов
/ 04 августа 2011

вы можете добавить по умолчанию TableRowSorter в JTable , но есть RowSorter , ничего лучше и понятнее, чем многосортный рендер ячеек таблицы Darryl *1007*

Определения примечаний для RowSorter действительны только для конкретного примера TableColumn

(с повторным использованием без использования balast)

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class HeaderDoubleclickTest {

    private String[] columnNames = {"String", "Integer", "Boolean"};
    private Object[][] data = {
        {"aaa", 12, true}, {"bbb", 5, false},
        {"CCC", 92, true}, {"DDD", 0, false}
    };
    private TableModel model = new DefaultTableModel(data, columnNames) {

        private static final long serialVersionUID = 1L;

        @Override
        public Class<?> getColumnClass(int column) {
            return getValueAt(0, column).getClass();
        }
    };
    private JTable table = new JTable(model);
    private JTableHeader header;

    static class TestTableRowSorter extends TableRowSorter<TableModel> {

        TestTableRowSorter(TableModel m) {
            super(m);
        }

        @Override
        public void toggleSortOrder(int column) {
        }

        public void wrapToggleSortOrder(int column) {
            super.toggleSortOrder(column);
        }
    }
    private Timer timer = new Timer(400, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("single");
            JTable table = header.getTable();
            RowSorter sorter;
            if (pt != null && table != null && (sorter = table.getRowSorter()) != null) {
                int columnIndex = header.columnAtPoint(pt);
                if (columnIndex != -1) {
                    columnIndex = table.convertColumnIndexToModel(columnIndex);
                    ((TestTableRowSorter) sorter).wrapToggleSortOrder(columnIndex);
                }
            }
        }
    });
    private Point pt;

    public JComponent makeUI() {
        timer.setRepeats(false);
        table.setRowSorter(new TestTableRowSorter(model));
        header = table.getTableHeader();
        header.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(final MouseEvent e) {
                if (timer.isRunning() && !e.isConsumed() && e.getClickCount() > 1) {
                    System.out.println("double");
                    pt = null;
                    timer.stop();
                } else {
                    pt = e.getPoint();
                    timer.restart();
                }
            }
        });
        JPanel p = new JPanel(new BorderLayout());
        p.add(new JScrollPane(table));
        return p;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    public static void createAndShowGUI() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().add(new HeaderDoubleclickTest().makeUI());
        f.setSize(320, 240);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
...