java - 如何在 JTable 中设置 CellEditor?
问题描述
我想CellEditor
为JComboBox
. JTable
它是一个单元格而不是所有列,我找不到Cell
在 JDK 中命名的类。
此代码无法解决我的要求。
table.getColumnModel().getColumn(columnIndex).setCellEditor(new DefaultCellEditor(new JComboBox));
解决方案
这很简单。你只需要重写getCellRenderer
. JTable
这是一个例子。
import java.awt.Component;
import java.awt.font.TextAttribute;
import java.util.Collections;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
@SuppressWarnings("unchecked")
public class TableRendererTest {
public static void main(String[] args) {
JFrame frm = new JFrame("Renderer test");
DefaultTableModel model = new DefaultTableModel(new String[] {"First", "Second", "Third" }, 3);
model.setValueAt("First row cell", 0, 1);
model.setValueAt("Striked out string", 1, 1);
model.setValueAt("Last row cell", 2, 1);
TableCellRenderer strikeOutRenderer = new StrikeOutRenderer();
// table with strike-out renderer (last cell is not stroked out)
// create a custom table with possibility to change renderer for a single cell.
JTable tbl = new JTable(model) {
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
if (row == 1 && column == 1) {
return strikeOutRenderer;
}
return super.getCellRenderer(row, column);
}
};
frm.add(new JScrollPane(tbl));
frm.pack();
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.setLocationRelativeTo(null);
frm.setVisible(true);
}
private static class StrikeOutRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
Component res = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
res.setFont(res.getFont().deriveFont(Collections.singletonMap(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON)));
return res;
}
}
}
这是完整解决方案的代码,因此您可以在任何地方使用该表,并可以为任何单元格定义渲染器。
// defined in JCellStyleTable.java
public class JCellStyleTable extends JTable {
private final Map<Cell, TableCellRenderer> renderersMap = new HashMap<>();
private final Map<Cell, TableCellEditor> editorsMap = new HashMap<>();
public JCellStyleTable() {
super();
}
public JCellStyleTable(TableModel dm) {
super(dm);
}
public void putRenderer(Cell cell, TableCellRenderer renderer) {
renderersMap.put(Objects.requireNonNull(cell), renderer);
}
public TableCellRenderer getRenderer(Cell cell) {
return renderersMap.get(Objects.requireNonNull(cell));
}
public void putEditor(Cell cell, TableCellEditor editor) {
editorsMap.put(Objects.requireNonNull(cell), editor);
}
public TableCellEditor getEditor(Cell cell) {
return editorsMap.get(Objects.requireNonNull(cell));
}
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
TableCellRenderer result = renderersMap.get(new Cell(row, column));
return result == null ? super.getCellRenderer(row, column) : result;
}
@Override
public TableCellEditor getCellEditor(int row, int column) {
return editorsMap.get(new Cell(row, column)); // when null - no editing
}
}
// defined in CellBasedTableModel.java
public class CellBasedTableModel extends DefaultTableModel {
private Collection<Cell> editableCells = new HashSet<>();
public CellBasedTableModel() {
// TODO Auto-generated constructor stub
}
@Override
public boolean isCellEditable(int row, int column) {
return editableCells.contains(new Cell(row, column));
}
public void addEditableCell(Cell cell) {
editableCells.add(cell);
}
public void removeEditableCell(Cell cell) {
editableCells.remove(cell);
}
}
// defined in Cell.java
public class Cell {
private final int row, col;
public Cell(int row, int col) {
this.row = row;
this.col = col;
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Cell) {
Cell another = (Cell) obj;
return another.col == col && another.row == row;
}
return false;
}
@Override
public int hashCode() {
return Arrays.hashCode(new int[] {row, col});
}
}
推荐阅读
- msbuild - Msbuild:根据文件内容过滤项目组
- c# - 两个属性相同时的LINQ groupby
- menuitem - 在android studio中调整appbar项目
- typescript - 基于其他接口创建对象/接口
- html - 图像和文本之间的空白即使 0 填充也不起作用
- scala - 使用错误的 Scala 版本编译插件
- python - 具有分类数据的一类支持向量机
- javascript - 如何总结总json
- postgresql - JBPM - 'Processinstacelog' 表在 Psotgres DB 中将状态显示为整数而不是文本数据类型
- ios - CollectionView iOS中的多个标签和ImageView