如何在更改单元格值Jtable后呈现单元格颜色

时间:2015-03-25 14:54:57

标签: java swing jtable tablecellrenderer

我有一个Jtable,里面有一些值[都是字符串]。有些值在它们前面有“*”我需要着色。我可以使用Cell Renderer为那些具有“*”的单元着色。但在我为单元格着色后,我需要删除“*”而不更改单元格颜色。当我尝试编辑单元格值时,颜色会变回WHITE。我在这里想念的是什么 这是代码

public SimpleTable()
{   
    JPanel panel = new JPanel();

    setTitle("Colored JTable");
    setBounds(400, 400, 400, 250);
    panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

    JTable table = new JTable(this.getRows(), this.getHeaders());
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);        
    table.setDefaultRenderer(Object.class, new MyTableRenderer());      

    this.scrollPane = new JScrollPane(table);
    panel.add(scrollPane);
    getContentPane().add(panel);
}

这是我的单元格渲染器

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
 Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

            if(table.getValueAt(row, column).toString().contains("*"))
            {               
                String v = table.getValueAt(row, column).toString().replace("*", "");               
                table.setValueAt(v, row, column);   
                cellComponent.setBackground(Color.YELLOW);              
            }
            else 
            {
                cellComponent.setBackground(Color.WHITE);                   
            }   
        return cellComponent;

1 个答案:

答案 0 :(得分:3)

选项:

  1. 将*留在单元格数据中,将其用作绘画标记,但不要在渲染器中渲染。
  2. 使用行的单独的非可视化字段(例如布尔值)来确定单元格是否应该涂成红色。
  3. 我赞成后者作为更清洁的OOP解决方案。请注意,您的单元格渲染器应该只渲染 。它永远不应该改变表所持有的数据。

    第一个例子:

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if(value != null && value.toString().contains("*")) {               
            value = value.toString().replace("*", "");               
            setBackground(Color.YELLOW);              
        } else {
            setBackground(Color.WHITE);                   
        }   
        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);