JTable
行を1つの非表示カラムに基づいてソートしたいと思います。 JTable隠しカラムに基づいた並べ替え
column1 column2
val1 val2
ようJTableのを持っていると言います。ユーザーがColumn2をクリックすると、Column2に基づいていないColumn3(非表示の列)に基づいて行がソートされます。
これをJTableでどのように実現するには?
JTable
行を1つの非表示カラムに基づいてソートしたいと思います。 JTable隠しカラムに基づいた並べ替え
column1 column2
val1 val2
ようJTableのを持っていると言います。ユーザーがColumn2をクリックすると、Column2に基づいていないColumn3(非表示の列)に基づいて行がソートされます。
これをJTableでどのように実現するには?
しかし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);
}
}
hiddlenカラムインデックスをwrapToggleSortOrder(intカラム)に渡す必要がありますか?非表示の列に基づいてソートされますか? – u449355
@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
使用コードはここに掲載:http://www.esus.com/docs/GetQuestionPage.jsp?uid=1270
変数/メソッドの引数col
があります - そのあなたがCOLUMN2場合だけチェックした場合、それはあなたの隠されたカラムであったようなので、それを扱う - それと再レンダリングテーブルでソートを。
+1これは旧バージョンのサポートに役立つかもしれません。この[回答](http://stackoverflow.com/questions/5798411/heads-up-on-implementing-rowsorter-and-rowfilter-java-1-4/5798542#5798542)も参照してください。 – trashgod
一つのアプローチは、Sとして、タイプColumn2
ためComparableインタフェースを実装することですこのexampleに表示され、対応するColumn3
の値を使用して比較してください。都合の良いことに、Column3
が既にComparable<Column3>
を実装している場合は、がDouble
であるため、Column3
に委任できます。
あなたのユーザーを混乱させるために;-) – kleopatra