2011-08-04 25 views
2

JTable行を1つの非表示カラムに基づいてソートしたいと思います。 JTable隠しカラムに基づいた並べ替え

は今、私は隠されている1以上COLUMN3を持っていると私は見せたいいけない、私はこの

column1 column2 
val1  val2 

ようJTableのを持っていると言います。ユーザーがColumn2をクリックすると、Column2に基づいていないColumn3(非表示の列)に基づいて行がソートされます。

これをJTableでどのように実現するには?

+1

あなたのユーザーを混乱させるために;-) – kleopatra

答えて

2
あなたは JTableにデフォルト TableRowSorterで追加することができます

しかしRowSorter、より良い何もありとのRowSorterのためのダリルのMultisort Table Header Cell Renderer

ノートの定義として、周りのクリアは

siple例(コンクリートTableColumnの有効な使用レス再びbalast)

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class HeaderDoubleclickTest { 

    private String[] columnNames = {"String", "Integer", "Boolean"}; 
    private Object[][] data = { 
     {"aaa", 12, true}, {"bbb", 5, false}, 
     {"CCC", 92, true}, {"DDD", 0, false} 
    }; 
    private TableModel model = new DefaultTableModel(data, columnNames) { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Class<?> getColumnClass(int column) { 
      return getValueAt(0, column).getClass(); 
     } 
    }; 
    private JTable table = new JTable(model); 
    private JTableHeader header; 

    static class TestTableRowSorter extends TableRowSorter<TableModel> { 

     TestTableRowSorter(TableModel m) { 
      super(m); 
     } 

     @Override 
     public void toggleSortOrder(int column) { 
     } 

     public void wrapToggleSortOrder(int column) { 
      super.toggleSortOrder(column); 
     } 
    } 
    private Timer timer = new Timer(400, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("single"); 
      JTable table = header.getTable(); 
      RowSorter sorter; 
      if (pt != null && table != null && (sorter = table.getRowSorter()) != null) { 
       int columnIndex = header.columnAtPoint(pt); 
       if (columnIndex != -1) { 
        columnIndex = table.convertColumnIndexToModel(columnIndex); 
        ((TestTableRowSorter) sorter).wrapToggleSortOrder(columnIndex); 
       } 
      } 
     } 
    }); 
    private Point pt; 

    public JComponent makeUI() { 
     timer.setRepeats(false); 
     table.setRowSorter(new TestTableRowSorter(model)); 
     header = table.getTableHeader(); 
     header.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseClicked(final MouseEvent e) { 
       if (timer.isRunning() && !e.isConsumed() && e.getClickCount() > 1) { 
        System.out.println("double"); 
        pt = null; 
        timer.stop(); 
       } else { 
        pt = e.getPoint(); 
        timer.restart(); 
       } 
      } 
     }); 
     JPanel p = new JPanel(new BorderLayout()); 
     p.add(new JScrollPane(table)); 
     return p; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    public static void createAndShowGUI() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new HeaderDoubleclickTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

hiddlenカラムインデックスをwrapToggleSortOrder(intカラム)に渡す必要がありますか?非表示の列に基づいてソートされますか? – u449355

+0

@Umesh:これは、ヘッダーのクリックを傍受し、シングルクリックとダブルクリックを区別する良い例です。並べ替え順序は直接指定しません。この[補完的アプローチ](http://stackoverflow.com/questions/6937694/jtable-sorting-based-on-hidden-column/6939889#6939889)も参照してください。 +1 [アルファアイコン](http://tips4java.wordpress.com/2010/08/22/alpha-icons/)。 – trashgod

3

使用コードはここに掲載:http://www.esus.com/docs/GetQuestionPage.jsp?uid=1270

変数/メソッドの引数colがあります - そのあなたがCOLUMN2場合だけチェックした場合、それはあなたの隠されたカラムであったようなので、それを扱う - それと再レンダリングテーブルでソートを。

+0

+1これは旧バージョンのサポートに役立つかもしれません。この[回答](http://stackoverflow.com/questions/5798411/heads-up-on-implementing-rowsorter-and-rowfilter-java-1-4/5798542#5798542)も参照してください。 – trashgod

2

一つのアプローチは、Sとして、タイプColumn2ためComparableインタフェースを実装することですこのexampleに表示され、対応するColumn3の値を使用して比較してください。都合の良いことに、Column3が既にComparable<Column3>を実装している場合は、がDoubleであるため、Column3に委任できます。

関連する問題