我想JTable
根据一个隐藏列对行进行排序。
假设我有一个这样的 JTable
column1 column2
val1 val2
现在我还有一个隐藏的 column3,我不想显示。当用户单击 Column2 时,它应该基于 Column3(隐藏列)而不是基于 Column2 对行进行排序。
如何在 JTable 中实现这一点?
我想JTable
根据一个隐藏列对行进行排序。
假设我有一个这样的 JTable
column1 column2
val1 val2
现在我还有一个隐藏的 column3,我不想显示。当用户单击 Column2 时,它应该基于 Column3(隐藏列)而不是基于 Column2 对行进行排序。
如何在 JTable 中实现这一点?
使用此处发布的代码:http ://www.esus.com/docs/GetQuestionPage.jsp?uid=1270
有变量/方法参数col
- 只需检查它是否属于你的 column2,如果是,则将其视为隐藏列 - 按它排序并重新呈现表。
您可以默认将TableRowSorter添加到JTable但有RowSorter ,没有什么比 Darryl 的Multisort Table Header Cell Renderer更好更清晰的了
RowSorter 的注释定义仅对具体的 TableColumn 有效
简单的例子(再次使用无用的镇流器)
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);
}
}
一种方法是为 type 实现Comparable接口Column2
,如本例所示,并使用相应的Column3
值进行比较。方便的是,如果Column3
已经实现了Comparable<Column3>
,您可以只委托给Column3
,就像示例中的Double
.