#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