2016-10-05 120 views
1

我有一个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); 
       } 
      } 
     }); 
    } 
} 

回答

1

查看功能: JTable#convertRowIndexToModel(int)JTable#convertRowIndexToView(int)

您将要转换你行,你从rowAtPoint获取到一行显示使用JTable#convertRowIndexToView(int)

+0

mod.getValueAt(trs.convertRowIndexToView(row),0));我用这个来获取行,这是第一次是正确的,但是如果我再次排序,通过不同的列或颠倒排序,它不会得到正确的行。你知道这是为什么吗?我没有使用convertRowIndexToModel函数。 –

+0

第二次获得什么排?如果没有更好的代码片段,我只能真正猜到。 – searchengine27

+0

玩得更多它似乎真的很奇怪。它在对最低>最高的int值进行排序时正确地对行进行排序,但对最高值>低值进行错误排序。例如按最低的y值对一列进行排序,得到ID:3,2,1,4.当我反转排序时,它正确地读取,但选择ID:2,3,4,1而不是4,1,2,3。你可能必须得到一个正确的代码片段。谢谢 –

0

使用mod.getValueAt(trs.convertRowIndexToModel(row), 0)而不是mod.getValueAt(trs.convertRowIndexToView(row), 0)正确选择已排序的行。

谢谢searchengine27