为什么混合会导致我的JTable的条件单元格渲染器?

时间:2013-01-16 00:59:36

标签: java swing jtable tablecellrenderer

我一直在关注教程,学习关于JTable Renderers / Editors的全部内容,但是我试图制作一个条件渲染器,意图根据一系列条件显示不同颜色的单元格。

这是我放在一起的SSCCE:

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumnModel;

public class Demo2 extends javax.swing.JFrame {

    public Demo2() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(300, 300);
        this.getContentPane().setLayout(new java.awt.GridLayout(1, 1));
        Object[] colunas = {"Col 0"};
        Object[][] dados = {{"A"},{"B"},{"C"},{"D"}};
        JTable tbl = new JTable(dados,colunas);
        TableColumnModel tcm = tbl.getColumnModel();
        tcm.getColumn(0).setCellRenderer(new CustomCellRenderer());
        JScrollPane sp = new JScrollPane(tbl);
        this.add(sp);
    }

    class CustomCellRenderer extends DefaultTableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component c = super.getTableCellRendererComponent(jtable, value, isSelected, hasFocus, row, column);
            if (value.toString().equals("B")) {
                c.setForeground(Color.GREEN);
                c.setFont(c.getFont().deriveFont(Font.BOLD));
            } else if (value.toString().equals("D")) {
                c.setForeground(Color.BLUE);
                c.setFont(c.getFont().deriveFont(Font.BOLD));
            }
            return this;
        }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Demo2().setVisible(true);
            }
        });
    }

}

正如我所料,第二个单元格具有绿色前景并且是粗体,第四个单元格也是蓝色和粗体。但是,其他细胞似乎也受到前景颜色变化的影响。

enter image description here

使用断点进行调试,我看到它只在正确的行中执行setForeground,尽管它执行了两次,这是意外的。

此外,如果我将最后一个单元格从“D”更改为“DD”,那么每个单元格的前景都会变为绿色。

我认为我遗漏了一些关于渲染器的基本信息。

1 个答案:

答案 0 :(得分:3)

当您的字体不需要加粗或将颜色更改回默认值时,您在哪里“取消加粗”字体?请记住,这不是自动完成的,而是您的代码需要专门执行此操作。我认为您需要有更多其他块才能响应所有情况。

即,

    @Override
    public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component c = super.getTableCellRendererComponent(jtable, value, isSelected, hasFocus, row, column);
        if (value.toString().equals("B")) {
            c.setForeground(Color.GREEN);
            c.setFont(c.getFont().deriveFont(Font.BOLD));
        } else if (value.toString().equals("D")) {
            c.setForeground(Color.BLUE);
            c.setFont(c.getFont().deriveFont(Font.BOLD));
        } else {
           c.setForeground(null);
           c.setFont(c.getFont().deriveFont(Font.PLAIN));
        }
        return this;
    }

JTable单元格不像单个组件,而是呈现 a 组件的图像。认为它们是用曲奇饼干制作的。如果您更换一个单元格的刀具并且不将其更改回来,则所有后续单元格都将受到影响。