Swing/TableSorter のバックアップ差分(No.14)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/TableSorter へ行く。
- 1 (2007-02-22 (木) 18:44:05)
- 2 (2007-03-09 (金) 01:26:17)
- 3 (2007-07-26 (木) 23:16:15)
- 4 (2007-07-30 (月) 16:34:50)
- 5 (2009-12-07 (月) 17:20:00)
- 6 (2010-08-05 (木) 06:07:47)
- 7 (2010-08-05 (木) 13:00:36)
- 8 (2010-08-05 (木) 15:42:51)
- 9 (2010-08-05 (木) 17:54:10)
- 10 (2010-09-10 (金) 12:41:32)
- 11 (2010-09-10 (金) 14:45:58)
- 12 (2010-09-10 (金) 16:22:46)
- 13 (2010-09-10 (金) 18:58:47)
- 14 (2013-03-31 (日) 20:02:48)
- 15 (2013-05-19 (日) 16:37:19)
- 16 (2013-07-26 (金) 01:14:47)
- 17 (2013-08-22 (木) 15:30:39)
- 18 (2013-09-10 (火) 00:40:59)
- 19 (2013-09-17 (火) 14:40:03)
- 20 (2014-05-02 (金) 12:48:55)
- 21 (2014-11-05 (水) 04:52:11)
- 22 (2014-11-25 (火) 03:03:31)
- 23 (2015-05-26 (火) 15:59:57)
- 24 (2016-05-26 (木) 15:32:04)
- 25 (2016-05-28 (土) 18:25:00)
- 26 (2016-06-01 (水) 18:46:02)
- 27 (2016-08-19 (金) 16:14:50)
- 28 (2017-03-31 (金) 16:09:06)
- 29 (2017-04-04 (火) 14:17:08)
- 30 (2018-03-15 (木) 13:17:19)
- 31 (2019-05-22 (水) 19:34:28)
- 32 (2020-03-18 (水) 22:15:53)
- 33 (2021-09-24 (金) 14:49:24)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:TableSorterでJTableをソート #navi(../) RIGHT:Posted by [[terai]] at 2005-02-28 #tags() RIGHT:Posted by &author(aterai); at 2005-02-28 *TableSorterでJTableをソート [#j367981a] TableSorter.javaを利用して、JTableの行を降順、昇順、初期状態にソートします。以下のサンプルは、以前Tutorialにあった((現在は、JDK 6 で導入された、TableRowSorter を使用するサンプルに更新されています。))、''TableSorter.java''を使用しています。%%The JavaTM Tutorialの[[Sorting and Otherwise Manipulating Data - How to Use Tables (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)>http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#sorting]]から、''TableSorter.java''((いつの間にか更新されていて、使いやすくなっています))を使用しています。%% TableSorter.javaを利用して、JTableの行を降順、昇順、初期状態にソートします。以下のサンプルは、以前Tutorialにあった((現在は、JDK 6 で導入された、TableRowSorter を使用するサンプルに更新されています。))、''TableSorter.java''を使用しています。%%The JavaTM Tutorialの[http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting Sorting and Otherwise Manipulating Data - How to Use Tables (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)]から、''TableSorter.java''((いつの間にか更新されていて、使いやすくなっています))を使用しています。%% -&jnlp; -&jar; -&zip; #screenshot //#screenshot #ref(http://lh3.ggpht.com/_9Z4BYR88imo/TQTUp0MLx6I/AAAAAAAAAmY/omjw4LoJbbc/s800/TableSorter.png) **サンプルコード [#nba2e358] #code{{ #code(link){{ //DefaultTableModel model = new DefaultTableModel(); TestModel model = new TestModel(); TableSorter sorter = new TableSorter(model); JTable table = new JTable(sorter); sorter.setTableHeader(table.getTableHeader()); }} **解説 [#h8a583cb] The JavaTM Tutorial版のTableSorterを使用して、[[JTableのソート>Swing/SortableTable]]で使用しているものと同じTableModelでソートしています。 The JavaTM Tutorial版のTableSorterには、Ctrlキーを押しながらヘッダをクリックすると、そのカラムを第二キーとしてソートする機能もあります。 Java version 1.4.xとWindows XPの環境で、ヘッダにカーソルを置いてもロールオーバーしない場合があるようです。上記のスクリーンショットはJava version 1.5.0_01 で撮っています。 1.5でGenericsの警告を出さないようにするには、TableSorter.javaに、以下のような修正を加えれば良いようです。ただし、まだ@SuppressWarnings("unchecked")があったり、テストも不十分です。 #code{{ private static class ComparableComparator implements Comparator { @SuppressWarnings("unchecked") public int compare(Object o1, Object o2) { return ((Comparable)o1).compareTo(o2); } } public static final ComparableComparator COMPARABLE_COMAPRATOR = new ComparableComparator(); public static final ComparableComparator LEXICAL_COMPARATOR = new ComparableComparator() { @SuppressWarnings("unchecked") public int compare(Object o1, Object o2) { return o1.toString().compareTo(o2.toString()); } }; private TableModelListener tableModelListener; private Map<Class, Comparator> columnComparators = new HashMap<Class, Comparator>(); private List<Directive> sortingColumns = new ArrayList<Directive>(); protected ComparableComparator getComparator(int column) { Class columnType = tableModel.getColumnClass(column); ComparableComparator comparator = (ComparableComparator) columnComparators.get(columnType); if (comparator != null) { return comparator; } private class Row implements Comparable<Row> { private int modelIndex; public Row(int index) { this.modelIndex = index; } public int compareTo(Row o) { int row1 = modelIndex; int row2 = o.modelIndex; //...... }} Java SE 6 では、JTable標準で簡単にソート機能を追加することができます([[SORTING AND FILTERING TABLES>http://java.sun.com/developer/JDCTechTips/2005/tt1115.html#2]]、[[TableRowSorterでJTableのソート>Swing/TableRowSorter]])。 Java SE 6 では、JTable標準で簡単にソート機能を追加することができます([http://java.sun.com/developer/JDCTechTips/2005/tt1115.html#2 SORTING AND FILTERING TABLES]、[[TableRowSorterでJTableのソート>Swing/TableRowSorter]])。 **参考リンク [#f1d425ba] -[[Sorting and Otherwise Manipulating Data - How to Use Tables (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)>http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#sorting]] -[[How to Use Tables>http://java.sun.com/docs/books/tutorial/uiswing/components/table.html]] -[[Generics - Simple method but hard with generics: compareTo()>http://forums.sun.com/thread.jspa?threadID=598815]] -[[TableSorter.java>http://java.sun.com/docs/books/tutorial/uiswing/examples/components/TableSorterDemoProject/src/components/TableSorter.java]] -[http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting Sorting and Otherwise Manipulating Data - How to Use Tables (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)] -[http://docs.oracle.com/javase/tutorial/uiswing/components/table.html How to Use Tables] -[http://forums.sun.com/thread.jspa?threadID=598815 Generics - Simple method but hard with generics: compareTo()] -[http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TableSorterDemoProject/src/components/TableSorter.java TableSorter.java] **コメント [#n7689273] - いつもお世話になっております。 jtableを下記のように初期化します。 #code{{ //DefaultTableModel model = new DefaultTableModel(); TestModel model = new TestModel(); TableSorter sorter = new TableSorter(model); JTable table = new JTable(sorter); sorter.setTableHeader(table.getTableHeader()); }} - その後、ソートした状態で、一行づつのデータを取り出した場合、 どうすればよろしいでしょうか?例えば、No.欄をソートして、下り順でNo.欄とName欄のデータを System.out.println(model.getValueAt(row, 1))したい場合、そのrowはsorterに関連していると思います。 row=?かが分かりません。説明下手で、大変申し訳ございません。ご教示をください。よろしくお願い致します。 -- [[Tiger]] &new{2010-08-05 (木) 06:07:47}; -- こんにちは。多分、sorter.modelIndex(viewIndex);でいいと思います。 -- [[terai]] &new{2010-08-05 (木) 13:17:51}; -- こんにちは。多分、sorter.modelIndex(viewIndex);でいいと思います。 -- [[aterai]] &new{2010-08-05 (木) 13:17:51}; #code{{ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; public class SorterModelIndex { public JComponent makeUI() { String[] columnNames = {"String", "Integer", "Boolean"}; Object[][] data = { {"aaa", 12, true}, {"bbb", 5, false}, {"CCC", 92, true}, {"DDD", 0, false} }; final DefaultTableModel model = new DefaultTableModel(data, columnNames) { @Override public Class<?> getColumnClass(int column) { return getValueAt(0, column).getClass(); } }; final TableSorter sorter = new TableSorter(model); final JTable table = new JTable(sorter); sorter.setTableHeader(table.getTableHeader()); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { int viewIndex = table.getSelectedRow(); if (!e.getValueIsAdjusting() && viewIndex>=0) { Object o = model.getValueAt(sorter.modelIndex(viewIndex), 0); System.out.println(o); } } }); 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 SorterModelIndex().makeUI()); f.setSize(320, 240); f.setLocationRelativeTo(null); f.setVisible(true); } } }} - 早速のご回答、ありがとうございました。 選択された行の値を取り出すことができますが、今回表(jTable)の内容をCSVに書き出そうとしております。即ち選択した行がない場合、ソートをして(上り順CCC、DDD,aaa、bbb), jTable.getValueAt(sorter.modelIndex(i),j);( i:行 j:列)、書き出した結果は(aaa,bbb,CCC,DDD)。即ちsorterしていなかったの状態で書き出されました。読みにくいかもしれませんが、ご教示ください。 宜しくお願い致します -- [[Tiger]] &new{2010-08-05 (木) 15:42:51}; -- JTableに表示されている見たまま(全選択、Ctrl-CでコピーしてTSV)の状態でということでしょうか。それならsorterは関係なく、以下のようにJTable#getValueAtメソッドを普通に使えばいいかもしれません(TableModel#getValueAtとJTable#getValueAtの違いに注意!)。 -- [[terai]] &new{2010-08-05 (木) 17:54:10}; -- JTableに表示されている見たまま(全選択、Ctrl-CでコピーしてTSV)の状態でということでしょうか。それならsorterは関係なく、以下のようにJTable#getValueAtメソッドを普通に使えばいいかもしれません(TableModel#getValueAtとJTable#getValueAtの違いに注意!)。 -- [[aterai]] &new{2010-08-05 (木) 17:54:10}; #code{{ p.add(new JButton(new AbstractAction("test") { @Override public void actionPerformed(ActionEvent e) { for (int i=0; i<table.getRowCount(); i++) { for (int j=0; j<table.getColumnCount(); j++) { //Object o = table.getValueAt(i, table.convertColumnIndexToView(j)); Object o = table.getValueAt(i, j); System.out.print(o+","); } System.out.print("\n"); } System.out.println("----"); } }), BorderLayout.SOUTH); }} - ありがとうございました。ご指摘の通り、できました。 -- [[Tiger]] &new{2010-08-05 (木) 18:08:42}; - いつもお世話になっております。JDK1.5を使っています。NameとComment欄をソートするとき、No.欄はソートさせないで、固定のままできますか?ご教示をよろしくお願いいたします。 -- [[Tiger]] &new{2010-09-10 (金) 12:41:32}; -- こんにちは。以下のようなレンダラーを使って、表示をrow(View)にしてしまうのが簡単な気がします(Ctrl+CなどでコピーするとModelの値がコピーされたりしますが…)。 -- [[terai]] &new{2010-09-10 (金) 14:45:58}; -- こんにちは。以下のようなレンダラーを使って、表示をrow(View)にしてしまうのが簡単な気がします(Ctrl+CなどでコピーするとModelの値がコピーされたりしますが…)。 -- [[aterai]] &new{2010-09-10 (金) 14:45:58}; #code{{ TableColumn col = table.getColumnModel().getColumn(0); col.setCellRenderer(new DefaultTableCellRenderer() { @Override public Component getTableCellRendererComponent( JTable table, Object v, boolean isS, boolean hasF, int row, int col) { Component c = super.getTableCellRendererComponent(table, v, isS, hasF, row, col); if(c instanceof JLabel) ((JLabel)c).setText(""+row); return c; } }); }} - いつもお世話になっております。JDK1.5を使っています。NameとComment欄をソートするとき、No.欄はソートさせないで、固定のままできますか?ご教示をよろしくお願いいたします。 -- [[Tiger]] &new{2010-09-10 (金) 16:22:46}; - ご教示、ありがとうございました。思ったとおりの動きです。 -- [[Tiger]] &new{2010-09-10 (金) 16:32:27}; #comment