2016-05-31 7 views
2

私は、 - >setAutoCreateRowSorter(true);とListSelectionModelの行の並べ替えのあるテーブルを持っています。私はそれを(ヘッダーをクリックして)並べ替える場合。Java sorted table listener

if(arg0.getValueIsAdjusting()){ 
    System.out.println(String.valueOf(tableProducts.getModel().getValueAt(tableProducts.getSelectedRow(), 1))); 
} 

答えて

0

あなたが読んでいる場合:

tableProducts=new JTable(table_modelProducts); 
tableProducts.setAutoCreateRowSorter(true); 
cellSelectionModelProducts = tableProducts.getSelectionModel(); 
cellSelectionModelProducts.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

問題は、その後、ソート、それとはセルをクリックした場合には、その位置(テーブルのソートの前にあった1)にある元の値を返すということですJavaコードの場合、getSelectedRow()は選択モデルに、getModel()はデータモデルを返します。データモデルと選択モデルは2つの異なるモデルです。そのため、正しいインデックスバックを取得できません。

正しい解決策は、JTable.getRowSorter()。convertRowIndexToModel()を呼び出してデータモデルインデックスを取得することです。ソーターは、基礎となるデータモデルをビューモデルにシャッフルするものです。論理的に考えると、それは2つのモデル間のマッピングを維持するものでなければならない。だからあなたのコードが

System.out.println(String.valueOf(tableProducts.getModel() 
    .getValueAt(tableProducts.getRowSorter().convertRowIndexToModel(
    tableProducts.getSelectedRow()), 1))); 

は、上記のメソッドを呼び出す方法のSystem.out.println(「正しい値=」)と行を参照してください、ベースとしてJavaチュートリアルからJTableの例を取るべきである、完全なコードですここに。それは実行可能です、あなたはアプリケーションを起動し、姓の列の見出しをクリックしてテストし、各姓をクリックしてコンソールの出力を観察できます。

import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

/* 
* SimpleTableDemo.java requires no other files. 
*/ 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class SimpleTableDemo extends JPanel { 
    private boolean DEBUG = false; 

    public SimpleTableDemo() { 
     super(new GridLayout(1,0)); 

     String[] columnNames = {"First Name", 
           "Last Name", 
           "Sport", 
           "# of Years", 
           "Vegetarian"}; 

     Object[][] data = { 
     {"Kathy", "Smith", 
     "Snowboarding", new Integer(5), new Boolean(false)}, 
     {"John", "Doe", 
     "Rowing", new Integer(3), new Boolean(true)}, 
     {"Sue", "Black", 
     "Knitting", new Integer(2), new Boolean(false)}, 
     {"Jane", "White", 
     "Speed reading", new Integer(20), new Boolean(true)}, 
     {"Joe", "Brown", 
     "Pool", new Integer(10), new Boolean(false)} 
     }; 

     final JTable table = new JTable(data, columnNames); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     table.setAutoCreateRowSorter(true); 
     table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { 

      @Override 
      public void valueChanged(ListSelectionEvent e) { 
       if(e.getValueIsAdjusting()) { 
        System.out.println("Wrong Value = " + String.valueOf(table.getModel().getValueAt(table.getSelectedRow(), 1))); 
        System.out.println("Right Value = " + String.valueOf(table.getModel().getValueAt(table.getRowSorter().convertRowIndexToModel(table.getSelectedRow()), 1))); 
       } 
      } 

     }); 
     table.setFillsViewportHeight(true); 

     if (DEBUG) { 
      table.addMouseListener(new MouseAdapter() { 
       public void mouseClicked(MouseEvent e) { 
        printDebugData(table); 
       } 
      }); 
     } 

     //Create the scroll pane and add the table to it. 
     JScrollPane scrollPane = new JScrollPane(table); 

     //Add the scroll pane to this panel. 
     add(scrollPane); 
    } 

    private void printDebugData(JTable table) { 
     int numRows = table.getRowCount(); 
     int numCols = table.getColumnCount(); 
     javax.swing.table.TableModel model = table.getModel(); 

     System.out.println("Value of data: "); 
     for (int i=0; i < numRows; i++) { 
      System.out.print(" row " + i + ":"); 
      for (int j=0; j < numCols; j++) { 
       System.out.print(" " + model.getValueAt(i, j)); 
      } 
      System.out.println(); 
     } 
     System.out.println("--------------------------"); 
    } 

    /** 
    * Create the GUI and show it. For thread safety, 
    * this method should be invoked from the 
    * event-dispatching thread. 
    */ 
    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("SimpleTableDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Create and set up the content pane. 
     SimpleTableDemo newContentPane = new SimpleTableDemo(); 
     newContentPane.setOpaque(true); //content panes must be opaque 
     frame.setContentPane(newContentPane); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

私の例を使用してください。私はそれを動作させることはできません – Ben

+0

サンプルコードで私の答えを更新しました。右の値を表示する行を参照してください。 –

+0

@Ben、それを動作させることはできますか? –