我有一个JTable,其中我使用整数比较器以及TableRowSorter
trs.setComparator(columnIndex, new IntComparator())
和table.setRowSorter(trs)
进行排序。JTable排序 - 选择一行
排序按预期工作,但我有一个鼠标点击事件,它使用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 && row <= table.getRowCount()) {
DefaultTableModel mod = (DefaultTableModel) table.getModel();
String ID = String.valueOf(mod.getValueAt(trs.convertRowIndexToView(row), 0));
System.out.println(ID);
}
}
});
}
}
mod.getValueAt(trs.convertRowIndexToView(row),0));我用这个来获取行,这是第一次是正确的,但是如果我再次排序,通过不同的列或颠倒排序,它不会得到正确的行。你知道这是为什么吗?我没有使用convertRowIndexToModel函数。 –
第二次获得什么排?如果没有更好的代码片段,我只能真正猜到。 – searchengine27
玩得更多它似乎真的很奇怪。它在对最低>最高的int值进行排序时正确地对行进行排序,但对最高值>低值进行错误排序。例如按最低的y值对一列进行排序,得到ID:3,2,1,4.当我反转排序时,它正确地读取,但选择ID:2,3,4,1而不是4,1,2,3。你可能必须得到一个正确的代码片段。谢谢 –