【发布时间】:2012-09-29 13:13:41
【问题描述】:
在 Java 中是否有任何实现来通过列(标题值)而不是行来过滤 JTable(使用搜索 JTextField)?我需要根据搜索时找到的字符串显示/隐藏列。
【问题讨论】:
标签: java jtable jtextfield rowfilter tablecolumn
在 Java 中是否有任何实现来通过列(标题值)而不是行来过滤 JTable(使用搜索 JTextField)?我需要根据搜索时找到的字符串显示/隐藏列。
【问题讨论】:
标签: java jtable jtextfield rowfilter tablecolumn
在 Java 中是否有任何实现来通过列(标题值)而不是行来过滤 JTable(使用搜索 JTextField)?
我需要根据搜索时找到的字符串显示/隐藏列。
这不是一件容易的工作,因为它需要大量的努力,以及对Java Essential classes、Swing 的丰富知识以及成为JTable 的专家
我不会这样,使用正确的ColumnRender,然后应该突出显示列,而不是在屏幕上跳转(隐藏-->显示-->隐藏等)JTables Column
有一些关于RowFilter、RowSorter 的例子,从来不需要,从来没有尝试过。
【讨论】:
我想我已经让它像这样工作了:
为临时表和表模型声明一些全局变量以保存隐藏列:
private JTable hiddenTable = new JTable();
private DefaultTableColumnModel hiddenModel = new DefaultTableColumnModel();
然后对每个按下的键使用过滤方法,将要隐藏的列添加到临时表模型中,同时将它们从主表模型中删除。然后,当字符串匹配时,通过将它们添加回主表并从临时表中删除它们来再次显示它们:
private void filterList() {
// Hide columns
for (TableColumn column : table.getColumns()) {
if (!((String) column.getHeaderValue()).toLowerCase().contains(
searchBox.getText().toLowerCase().trim())) {
hiddenModel.addColumn(column);
table.getColumnModel().removeColumn(column);
}
}
// Show columns
for (TableColumn column : hiddenTable.getColumns()) {
if (((String) column.getHeaderValue()).toLowerCase().contains(
searchBox.getText().toLowerCase().trim())) {
table.getColumnModel().addColumn(column);
hiddenModel.removeColumn(column);
}
}
}
这里唯一的问题是,当重新添加到表中时,列会失去顺序。
【讨论】:
您可以使用自定义的TableModel 实现来包装您的真实模型来进行过滤。只要在列发生变化时不断通知 TableModelListeners。
【讨论】: