Сортировка в JTable — выбор строки

#java #swing #sorting #jtable

#java #качать #сортировка #jtable

Вопрос:

У меня есть JTable, где я использовал целочисленный компаратор вместе с TableRowSorter
trs.setComparator(columnIndex, new IntComparator()) и table.setRowSorter(trs) для сортировки.

Сортировка работает так, как задумано, однако у меня есть событие щелчка мышью, которое использует int row = table.rowAtPoint(e.getPoint()) и DefaultTabelModel mod = (DefaultTableModel)table.getModel() для получения значений выбранной строки mod.getValueAt(row, 0) .

Это возвращает значение строки в этой позиции в исходной сортировке JTable, а не строки, которая находится там сейчас после сортировки. Как я могу заставить это работать и для отсортированной таблицы?

Спасибо

РЕДАКТИРОВАТЬ: Пример кода

 import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Comparator;

public class Test extends JFrame{
    JTable table = new JTable();
    JPanel panel = new JPanel();

    public Test() {
        add(panel);
        pack();
        setResizable(false);
        setVisible(true);
        setSize(1280, 720);
        setupTable();
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }
    public void setupTable() {

        Object[][] data = new Object[][]{
                {1, 15, 17},
                {2, 45, 7},
                {3, 9, 26},
                {4, 65, 65}
        };
        Object[] columns = new Object[]{"ID", "X", "Y"};

        table = new JTable(new DefaultTableModel(data, columns) {
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        });

        table.setPreferredScrollableViewportSize(new Dimension(720, 400));
        table.setFillsViewportHeight(true);
        JScrollPane scrollPane = new JScrollPane(table);
        panel.add(scrollPane);
        TableRowSorter<DefaultTableModel> trs = new TableRowSorter(table.getModel());


        class IntComparator implements Comparator {
            public int compare(Object o1, Object o2) {
                Integer int1 = (Integer) o1;
                Integer int2 = (Integer) o2;
                return int1.compareTo(int2);
            }

            public boolean equals(Object o2) {
                return this.equals(o2);
            }
        }
        for (int i = 0; i < 3; i  ) {
            trs.setComparator(i, new IntComparator());
        }
        table.setRowSorter(trs);
        table.setAutoCreateRowSorter(false);

        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                int row = table.rowAtPoint(e.getPoint());
                if (0 <= row amp;amp; row <= table.getRowCount()) {
                    DefaultTableModel mod = (DefaultTableModel) table.getModel();
                    String ID = String.valueOf(mod.getValueAt(trs.convertRowIndexToView(row), 0));
                    System.out.println(ID);
                }
            }
        });
    }
}
  

Ответ №1:

Смотрите функции: JTable#convertRowIndexToModel(int) и JTable#convertRowIndexToView(int)

Вы захотите преобразовать строку, из которой вы получаете rowAtPoint , в строку, которая отображается с помощью JTable#convertRowIndexToView(int)

Комментарии:

1. mod.getValueAt(trs.convertRowIndexToView(row), 0)); Я использовал это, чтобы получить строку, и с первого раза она была правильной, однако, если я снова отсортирую, либо по другому столбцу, либо отменю сортировку, правильная строка не будет получена. Вы знаете, почему это может быть? Я не использовал функцию convertRowIndexToModel.

2. Какую строку он получает во второй раз? Без лучшего фрагмента кода я могу только догадываться.

3. Поиграйте с этим немного больше, это кажется действительно странным. Он правильно сортирует строки при сортировке значений lowest-> highest int, но неправильно при значениях highest-> low. например, сортировка по одному столбцу по наименьшему значению y дает идентификаторы: 3, 2, 1, 4. Когда я переворачиваю сортировку, она считывается правильно, но выбирает ID: 2, 3, 4, 1 вместо 4, 1, 2, 3. Мне, вероятно, придется получить правильный фрагмент кода. Спасибо

4. Да, похоже, что ваш компаратор отключен и неправильно реализован. Проверьте свою логику, чтобы убедиться, что вы все сделали правильно.

5. Компаратор сортирует его правильно. Я вижу правильные сортировки, только при сортировке в обратном порядке они выбираются неправильно. Представление таблицы по-прежнему корректно

Ответ №2:

Использование mod.getValueAt(trs.convertRowIndexToModel(row), 0) вместо mod.getValueAt(trs.convertRowIndexToView(row), 0) выбранных отсортированных строк правильно.

Спасибо searchengine27