简体   繁体   English

如何在JTable中设置CellEditor?

[英]How to set CellEditor in JTable?

I want to set CellEditor with JComboBox for one cell in a JTable . 我想使用JComboBoxJTable一个单元格设置CellEditor It is one cell rather than the all column, I cannot find a class named Cell in JDK. 它是一个单元格,而不是全部列,我在JDK中找不到名为Cell的类。

This code cannot solve my requirement. 此代码无法解决我的要求。

table.getColumnModel().getColumn(columnIndex).setCellEditor(new DefaultCellEditor(new JComboBox));  

It's simple. 这很简单。 You only need to override the method getCellRenderer of JTable . 您只需要重写JTable getCellRenderer方法。 Here is an example. 这是一个例子。

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;
        }
    }
}

And here is code for a complete solution, so you can use the table everywhere and can define renderer for any cell. 这里是完整解决方案的代码,因此您可以在任何地方使用该表,并可以为任何单元格定义渲染器。

// 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM