【发布时间】:2021-03-05 05:52:15
【问题描述】:
有人知道不使用内置排序功能在 JTable 标题中显示排序图标的好方法吗?
排序是由表模型(实际上是一个数据库)完成的,而不是由 JTable 本身完成的。这就是为什么图标的自动显示不起作用的原因。也许可以插入一个不执行任何操作但显示排序图标的虚拟 RowSorter?
我找到了更好的解决方案
我只是写了自己的RowSorter,这样排序没有任何作用,而是将排序请求重定向到模型。这样,排序顺序由外观本身显示。一些伪代码:
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.swing.RowSorter;
import xyz.SortableTableModel;
public class MyRowSorter<M extends SortableTableModel> extends RowSorter<M> {
private M tableModel;
private List<? extends SortKey> sortKeys = new LinkedList<>();
public MyRowSorter(M tableModel) {
this.tableModel = tableModel;
}
@Override
public M getModel() {
return tableModel;
}
@Override
public void toggleSortOrder(int column) {
// redirecting sort request to model and modification of sortKeys
List<? extends SortKey> newSortKeys = ...;
setSortKeys(newSortKeys);
}
@Override
public int convertRowIndexToModel(int index) {
return index; // will always be the same
}
@Override
public int convertRowIndexToView(int index) {
return index; // will always be the same
}
@Override
public void setSortKeys(List<? extends SortKey> keys) {
if (keys == null) {
sortKeys = Collections.EMPTY_LIST;
} else {
sortKeys = Collections.unmodifiableList(keys);
}
fireSortOrderChanged();
}
@Override
public List<? extends SortKey> getSortKeys() {
return sortKeys;
}
@Override
public int getViewRowCount() {
return tableModel.getRowCount();
}
@Override
public int getModelRowCount() {
return tableModel.getRowCount();
}
// no need for any implementation
@Override public void modelStructureChanged() { }
@Override public void allRowsChanged() { }
@Override public void rowsInserted(int firstRow, int endRow) { }
@Override public void rowsDeleted(int firstRow, int endRow) { }
@Override public void rowsUpdated(int firstRow, int endRow) { }
@Override public void rowsUpdated(int firstRow, int endRow, int column) { }
}
【问题讨论】:
-
您可以尝试使用您的图标行为编写自定义 TableHeader Renderer。
-
我已经试过了。但是这个解决方案的问题是,标题渲染器应该使用系统外观。自定义渲染器显然根本不使用外观和感觉(除了看起来像标签或其他东西)。
-
查看我的答案,该答案提供了默认 L&F 和标题装饰的解决方案。
-
一个自定义渲染器显然根本不使用观感——为什么你认为没有应用L&F
标签: java swing sorting jtable jtableheader