[英]How to set celleditor false in JTable in netbeans IDE in java?
[英]How to set CellEditor in JTable?
我想使用JComboBox
为JTable
一个单元格设置CellEditor
。 它是一个单元格,而不是全部列,我在JDK中找不到名为Cell
的类。
此代码无法解决我的要求。
table.getColumnModel().getColumn(columnIndex).setCellEditor(new DefaultCellEditor(new JComboBox));
这很简单。 您只需要重写JTable
getCellRenderer
方法。 这是一个例子。
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});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.