- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
以下情况:我有一个带有 RowHeader 的 J(X)Table(作为指导,我使用了 Rob Camicks 中的一个很棒的 Examples)。一切都按预期工作。
根据要求,我从服务器收到的数据已经包含一个表行号,我必须在行标题中显示它,并且数据应该是可过滤的。所以我扩展了示例,并添加了一个过滤器。当我过滤 View 时,我在行号中看到了间隙(例如:1、3、6、..),这是预期的效果。
为了能够按我自己的表格行对表格进行过滤和排序,我添加了一个 TableRowSorter
.在这里我开始感到困惑。该示例对 mainTable 和 rowHeaderTable 使用相同的 TableModel 和 SelectionModel:
setModel( main.getModel() );
setSelectionModel( main.getSelectionModel() );
这很好,因为我不必同步它们。但是关于 TableRowSorter
我突然不确定,如果我也可以甚至必须使用相同的 TableRowSorter
-Instance 或者我是否必须创建一个 TableRowSorter
为每个表。首先,我将相同的内容添加到两个表中,因为这看起来很实际,但后来在许多情况下我得到了 IndexOutOfBound-Exceptions
。经过一番挖掘后,我发现这是因为 TableRowSorter
在每个 TableModelEvent
中更新了两次,因为每个表(RowHeader 和 MainTable)都会通知 TableRowSorter
关于表格本身的变化。
现在我不确定哪条路是正确的。我想到了以下解决方案:我应该添加第二个 TableRowSorter(每个表一个)并同步它们,还是应该将 TableModel 包装在 RowHeaderTable 中并让它不触发任何事件?或者也许我应该创建我自己的 RowHeaderTable 类型,它根本不通知排序器有关更改?
最佳答案
这是包装 RowSorter 的快速(注意:未经正式测试!尽管使用示例工作正常)实现。
客户有责任使其与主表中使用的行排序器保持同步
使用示例(在 SwingX 测试基础设施和 SwingX sortController/table 方面):
public void interactiveRowSorterWrapperSharedXTable() {
final DefaultTableModel tableModel = new DefaultTableModel(list.getElementCount(), 2) {
@Override
public Class<?> getColumnClass(int columnIndex) {
return Integer.class;
}
};
for (int i = 0; i < tableModel.getRowCount(); i++) {
tableModel.setValueAt(i, i, 0);
tableModel.setValueAt(tableModel.getRowCount() - i, i, 1);
}
final JXTable master = new JXTable(tableModel);
final TableSortController<TableModel> rowSorter = (TableSortController<TableModel>) master.getRowSorter();
master.removeColumn(master.getColumn(0));
final JXTable rowHeader = new JXTable(master.getModel());
rowHeader.setAutoCreateRowSorter(false);
rowHeader.removeColumn(rowHeader.getColumn(1));
rowHeader.setRowSorter(new RowSorterWrapper<TableModel>(rowSorter));
rowHeader.setSelectionModel(master.getSelectionModel());
// need to disable selection update on one of the table's
// otherwise the selection is not kept in model coordinates
rowHeader.setUpdateSelectionOnSort(false);
JScrollPane scrollPane = new JScrollPane(master);
scrollPane.setRowHeaderView(rowHeader);
JXFrame frame = showInFrame(scrollPane, "xtables (wrapped sortController): shared model/selection");
Action fireAllChanged = new AbstractAction("fireDataChanged") {
@Override
public void actionPerformed(ActionEvent e) {
tableModel.fireTableDataChanged();
}
};
addAction(frame, fireAllChanged);
Action removeFirst = new AbstractAction("remove firstM") {
@Override
public void actionPerformed(ActionEvent e) {
tableModel.removeRow(0);
}
};
addAction(frame, removeFirst);
Action removeLast = new AbstractAction("remove lastM") {
@Override
public void actionPerformed(ActionEvent e) {
tableModel.removeRow(tableModel.getRowCount() - 1);
}
};
addAction(frame, removeLast);
Action filter = new AbstractAction("toggle filter") {
@Override
public void actionPerformed(ActionEvent e) {
RowFilter filter = rowSorter.getRowFilter();
if (filter == null) {
rowSorter.setRowFilter(RowFilter.regexFilter("^1", 1));
} else {
rowSorter.setRowFilter(null);
}
}
};
addAction(frame, filter);
addStatusMessage(frame, "row header example with RowSorterWrapper");
show(frame);
}
RowSorterWrapper:
/**
* Wrapping RowSorter for usage (f.i.) in a rowHeader.
*
* Delegates all state queries,
* does nothing on receiving notification of model changes,
* propagates rowSorterEvents from delegates.
*
* Beware: untested!
*
* @author Jeanette Winzenburg, Berlin
*/
public class RowSorterWrapper<M> extends RowSorter<M> {
private RowSorter<M> delegate;
private RowSorterListener rowSorterListener;
public RowSorterWrapper(RowSorter<M> delegate) {
this.delegate = delegate;
delegate.addRowSorterListener(getRowSorterListener());
}
/**
* Creates and returns a RowSorterListener which re-fires received
* events.
*
* @return
*/
protected RowSorterListener getRowSorterListener() {
if (rowSorterListener == null) {
RowSorterListener listener = new RowSorterListener() {
@Override
public void sorterChanged(RowSorterEvent e) {
if (RowSorterEvent.Type.SORT_ORDER_CHANGED == e.getType()) {
fireSortOrderChanged();
} else if (RowSorterEvent.Type.SORTED == e.getType()) {
fireRowSorterChanged(null); }
}
};
rowSorterListener = listener;
}
return rowSorterListener;
}
@Override
public M getModel() {
return delegate.getModel();
}
@Override
public void toggleSortOrder(int column) {
delegate.toggleSortOrder(column);
}
@Override
public int convertRowIndexToModel(int index) {
return delegate.convertRowIndexToModel(index);
}
@Override
public int convertRowIndexToView(int index) {
return delegate.convertRowIndexToView(index);
}
@Override
public void setSortKeys(List keys) {
delegate.setSortKeys(keys);
}
@Override
public List getSortKeys() {
return delegate.getSortKeys();
}
@Override
public int getViewRowCount() {
return delegate.getViewRowCount();
}
@Override
public int getModelRowCount() {
return delegate.getModelRowCount();
}
@Override
public void modelStructureChanged() {
// do nothing, all work done by delegate
}
@Override
public void allRowsChanged() {
// do nothing, all work done by delegate
}
@Override
public void rowsInserted(int firstRow, int endRow) {
// do nothing, all work done by delegate
}
@Override
public void rowsDeleted(int firstRow, int endRow) {
// do nothing, all work done by delegate
}
@Override
public void rowsUpdated(int firstRow, int endRow) {
// do nothing, all work done by delegate
}
@Override
public void rowsUpdated(int firstRow, int endRow, int column) {
// do nothing, all work done by delegate
}
}
关于java - 如何使用 RowHeader 处理 JTables 中的 RowSorter 同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18012114/
我在 jTable 中实现了用于排序列的图标。我有一个用于查找结果的按钮,并且在启动工作程序时实现了默认排序。像这样: public void refreshStripedViewTable(fina
我有一个使用 RowSorter(Java 1.6) 的 JTable,我使用的是使用 Java 1.4 实现的外观,当时没有在 Java 中添加 RowSorter。现在我的问题是:当我点击表格标题
我有一个JTable 和一个TableRowSorter,我想在排序完成后 执行操作。我一直在浏览网页,但到目前为止我运气不佳。 最初我认为只需要一个 RowSorterListener 就可以解决问
我有一个简单的 JTable,第一列保存整数,第二列保存字符串。我希望能够对每一列进行排序。 我的渲染器: package gui.table; import gui.DaimlerColor
我想知道:插入一行后如何重新排序(重新排序)JTable 行? 我使用下一个代码: TableModel model = new DefaultTableModel(rows, columns) {
我需要一个具有与 TableRowSorter/DefaultRowSorter 提供的插入行为不同的 JTable。 我需要一个表,这样当用户插入一行时,新插入的行应该在光标所在行的下方,并且光标放
我在 JTable 中使用 RowSorter,当我对其中一列进行排序并调用方法 getSelectedRowData() 时,它返回了错误的数据。 public Object getSelected
我注意到,当我有一个带有 JScrollPane 包含的 TableRowSorter 的 JTable 时,直到我为排序器创建 SortKeys 后才会出现垂直滚动条(这是通过为其中一列调用togg
谁能告诉我如何实现我自己的行过滤器和行排序器以应用于 Jtable,同时记住我使用的是 Java 1.4?或者是否有一些可用的类可以满足该目的? 问候。 最佳答案 您可以使用 Philip Milne
以下情况:我有一个带有 RowHeader 的 J(X)Table(作为指导,我使用了 Rob Camicks 中的一个很棒的 Examples)。一切都按预期工作。 根据要求,我从服务器收到的数据已
我对 Java 还很陌生,我一整天都过度尝试自己解决这个问题,但它不起作用。我正在尝试编写一个与 Excel 工作表连接的 Java 应用程序,并允许通过 GUI 插入/保存/排序适合电影数据库的数据
我是一名优秀的程序员,十分优秀!