2016-10-05 21 views
1

私は整数型コンパレータを使って整数型コンパレータを使って、並べ替えにはTableRowSorter trs.setComparator(columnIndex, new IntComparator())table.setRowSorter(trs)のJTableを持っています。JTableのソート - 行の選択

ソートは意図したとおりに動作しますが、int row = table.rowAtPoint(e.getPoint())DefaultTabelModel mod = (DefaultTableModel)table.getModel()を使用して、mod.getValueAt(row, 0)で選択された行の値を取得するマウスクリックイベントがあります。

これは、ソート後に現在存在する行ではなく、JTableの元のソートにおけるこの位置の行の値を取得します。ソートされたテーブルでもこの​​作業を行うにはどうすればよいですか?

おかげ

EDIT:あなたはrowAtPointからその行を取得することをあなたの行を変換することになるでしょう JTable#convertRowIndexToModel(int)JTable#convertRowIndexToView(int)

:サンプルコード

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#convertRowIndexToView(int)

+0

mod.getValueAt(trs.convertRowIndexToView(row)、0));私は行を取得するためにこれを使用しましたが、最初は正しくなりましたが、再度別の列でソートするかソートを逆にしても正しい行が得られませんでした。なぜこれが起こるか知っていますか?私はconvertRowIndexToModel関数を使用していません。 –

+0

2回目の行は何ですか?より良いコードスニペットがなければ、私は本当に推測することができます。 – searchengine27

+0

もう少しそれを再生すると、それは本当に奇妙に見えます。最低 - >最高のint値をソートするときに行を正しくソートしますが、最高 - >低の値では間違ってソートします。例えば私はソートを逆にすると正しく読み込まれますが、ID:2,3,4,1の代わりに4,1,2,3が選択されます。おそらく適切なコードスニペットを取得する必要があります。ありがとう –

0

mod.getValueAt(trs.convertRowIndexToView(row), 0)の選択されたソート行の代わりにmod.getValueAt(trs.convertRowIndexToModel(row), 0)を使用してください。

ありがとうございました。