如何在 JTable 中裁剪选择的数据?
How to crop a selection of data in JTable?
所以我写了一段代码,使用 MouseListener 来 select/highlight JTable 中的数据。我想裁剪突出显示的数据。例如,我会突出显示第一列和第三列向下 20 行,单击一个按钮并使用突出显示的数据创建一个新的 JTable。这是我突出显示数据的 MouseListener 方法:
public void DataSelection(JTable table) {
JTable Table = table;
JTableHeader columnHeader = Table.getTableHeader();
//***Row Selection***//
Table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent mouseEvent) {
Table.setColumnSelectionAllowed(true);
Table.setRowSelectionAllowed(true);
if (Table.isCellSelected(Table.getSelectedRow(), 0)) {
Table.setColumnSelectionAllowed(false);
Table.setRowSelectionAllowed(true);
}
}
});
//***Column Selection***//
columnHeader.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent mouseEvent) {
int columnPoint = columnHeader.columnAtPoint(mouseEvent.getPoint());
Object columnCursorType = columnHeader.getCursor().getType();
if (columnCursorType == Cursor.E_RESIZE_CURSOR)
mouseEvent.consume();
else {
if (columnPoint == 0)
Table.selectAll();
else {
Table.setColumnSelectionAllowed(true);
Table.setRowSelectionAllowed(false);
Table.clearSelection();
Table.setColumnSelectionInterval(columnPoint, columnPoint);
}
}
}
});
}
所以,你得到了三个信息:
- 所选列
- 所选行
- 数据
您需要创建一种方法将这些组合在一起以生成 "cropped" 数据视图
现在您 "could" 直接过滤数据并简单地将其播种到新的 TableModel
中,但我认为这需要更多工作
相反,我会专注于直接过滤 TableColumnModel
和 JTable
。
JTable
已经支持过滤,因此您需要做的就是设计一个支持行范围的自定义过滤器。首先查看 How to use JTable: Sorting and Filtering 了解更多详情
过滤 TableColumnModel
不是那么容易,因为它没有内置功能,您需要自己设计。幸运的是,很多其他人在你之前有过这个需求。
例如:
- Add column to exiting TableModel
- Table Column Manager
有了这只手,您可以轻松创建过滤的 TableModel
和自定义 TableRowFilter
,将现有数据/TableModel
传递给 JTable
的新实例并对其应用过滤后的 TableModel
和 TableRowFilter
"But where's my runnable example?" 你说 - 嗯,没有一个,为什么?因为总体要求太宽泛,所以必须回答两个问题才能达到结果。
话虽如此,但有大量链接示例可为您提供设计自己的可行解决方案所需的基本信息
所以我写了一段代码,使用 MouseListener 来 select/highlight JTable 中的数据。我想裁剪突出显示的数据。例如,我会突出显示第一列和第三列向下 20 行,单击一个按钮并使用突出显示的数据创建一个新的 JTable。这是我突出显示数据的 MouseListener 方法:
public void DataSelection(JTable table) {
JTable Table = table;
JTableHeader columnHeader = Table.getTableHeader();
//***Row Selection***//
Table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent mouseEvent) {
Table.setColumnSelectionAllowed(true);
Table.setRowSelectionAllowed(true);
if (Table.isCellSelected(Table.getSelectedRow(), 0)) {
Table.setColumnSelectionAllowed(false);
Table.setRowSelectionAllowed(true);
}
}
});
//***Column Selection***//
columnHeader.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent mouseEvent) {
int columnPoint = columnHeader.columnAtPoint(mouseEvent.getPoint());
Object columnCursorType = columnHeader.getCursor().getType();
if (columnCursorType == Cursor.E_RESIZE_CURSOR)
mouseEvent.consume();
else {
if (columnPoint == 0)
Table.selectAll();
else {
Table.setColumnSelectionAllowed(true);
Table.setRowSelectionAllowed(false);
Table.clearSelection();
Table.setColumnSelectionInterval(columnPoint, columnPoint);
}
}
}
});
}
所以,你得到了三个信息:
- 所选列
- 所选行
- 数据
您需要创建一种方法将这些组合在一起以生成 "cropped" 数据视图
现在您 "could" 直接过滤数据并简单地将其播种到新的 TableModel
中,但我认为这需要更多工作
相反,我会专注于直接过滤 TableColumnModel
和 JTable
。
JTable
已经支持过滤,因此您需要做的就是设计一个支持行范围的自定义过滤器。首先查看 How to use JTable: Sorting and Filtering 了解更多详情
过滤 TableColumnModel
不是那么容易,因为它没有内置功能,您需要自己设计。幸运的是,很多其他人在你之前有过这个需求。
例如:
- Add column to exiting TableModel
- Table Column Manager
有了这只手,您可以轻松创建过滤的 TableModel
和自定义 TableRowFilter
,将现有数据/TableModel
传递给 JTable
的新实例并对其应用过滤后的 TableModel
和 TableRowFilter
"But where's my runnable example?" 你说 - 嗯,没有一个,为什么?因为总体要求太宽泛,所以必须回答两个问题才能达到结果。
话虽如此,但有大量链接示例可为您提供设计自己的可行解决方案所需的基本信息