在DefaultTableCellRenderer中更改回默认背景颜色

时间:2017-12-27 16:46:24

标签: java swing jtable

我正在阅读以下部分:

所以我决定编写自己的自定义渲染器:

public class MyRenderer extends DefaultTableCellRenderer {
    @Override
    protected void setValue(Object value) {
        try {
            String text = MyFormatter.format(value);
            //setBackground(Color.white); // my text becomes invisible
            //setBackground(null); // my text becomes invisible
            setBackground(???);
            setText(text);
        } catch (IllegalArgumentException e) {
            // Something is not quite right, indicate the error to the user:
            setBackground(Color.red); // at this point in time getBackground() returns Color.blue
            super.setValue(value);
        }
    }
}

我了解如何更改背景颜色以指示格式错误的字段。在用户手动编辑之后,我希望将该字段恢复为原始背景颜色。但到目前为止,我还不明白该怎么做。在这种情况下我可以使用DefaultTableCellRenderer吗?我应该实施TableCellRenderer .getTableCellRendererComponent吗?

我能够得到一些东西:

            [...]
            String text = MyFormatter.format(value);
            setBackground(null);
            setForeground(null); // need both to null
            setText(text);

但是在选择行时会打破视频反转模式......

更新:我无法使用getBackground()并将颜色值存储在私有成员中,因为编辑背景颜色为Color.blue时。

1 个答案:

答案 0 :(得分:-1)

经过多次试错,这是我到目前为止找到的唯一解决方案:

protected void setValue(Object value) {
    try {
        String text = MyFormatter.format(value);            
        if (errorState) {
            updateUI(); // call setBackground(null) and properly repaint()
            errorState = false;
        }
        setText(text);
    } catch (IllegalArgumentException e) {
        // store error state:
        errorState = true;
        // Something is not quite right, indicate the error to the user:
        setBackground(Color.red);
        super.setValue(value);
    }
}

由于在完成编辑后背景显示为白色而不是蓝色,因此这并不完美。但这比编辑后文本不会出现的原始行为更好。