2016-10-05 2 views
1

Ich habe eine JTable, wo ich einen ganzzahligen Komparator zusammen mit einem TableRowSorter trs.setComparator(columnIndex, new IntComparator()) und table.setRowSorter(trs) zu sortieren.JTable Sortierung - Auswahl einer Zeile

Die Sortierung funktioniert wie beabsichtigt, aber ich habe ein Mausklick-Ereignis, das int row = table.rowAtPoint(e.getPoint()) und DefaultTabelModel mod = (DefaultTableModel)table.getModel() verwendet, um die Werte der Zeile mit mod.getValueAt(row, 0) ausgewählt zu erhalten.

Dadurch wird der Wert der Zeile an dieser Position in der ursprünglichen Sortierung der JTable, nicht die Zeile, die jetzt nach dem Sortieren ist. Wie kann ich das auch für die sortierte Tabelle machen?

Dank

EDIT: Beispielcode

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); 
       } 
      } 
     }); 
    } 
} 

Antwort

1

Siehe die Funktionen: JTable#convertRowIndexToModel(int) und JTable#convertRowIndexToView(int)

Sie wollen Ihre Zeile konvertieren, die Sie von rowAtPoint auf die Reihe bekommen, dass wird angezeigt mit JTable#convertRowIndexToView(int)

+0

mod.getValueAt (trs.convertRowIndexToView (Zeile), 0)); Ich benutzte dies, um die Zeile zu bekommen, und es war beim ersten Mal korrekt, aber wenn ich wieder sortierte, entweder durch eine andere Spalte oder die Sortierung umkehrte, würde es nicht die richtige Zeile bekommen. Weißt du, warum das wäre? Ich habe die Funktion convertRowIndexToModel nicht verwendet. –

+0

In welcher Zeile wird es zum zweiten Mal angezeigt? Ohne ein besseres Code-Snippet kann ich nur raten. – searchengine27

+0

Mit etwas mehr herumspielen es scheint wirklich komisch. Es sortiert die Zeilen beim Sortieren der niedrigsten -> höchsten int-Werte korrekt, aber nicht richtig bei den höchsten -> niedrigen Werten. z.B. Sortierung nach einer Spalte nach dem niedrigsten y-Wert ergibt IDs: 3, 2, 1, 4. Wenn ich die Sortierung umkehre, liest es korrekt, wählt aber ID: 2, 3, 4, 1 statt 4, 1, 2, 3. I ' Ich werde wahrscheinlich ein richtiges Code-Snippet bekommen. Danke –

0

Mit mod.getValueAt(trs.convertRowIndexToModel(row), 0) anstelle von mod.getValueAt(trs.convertRowIndexToView(row), 0) sortierte Reihen richtig ausgewählt.

Dank searchengine27