【问题标题】:JTable CellRenderer changes foreground color only when focusedJTable Cell Renderer 仅在聚焦时更改前景色
【发布时间】:2020-07-07 10:19:06
【问题描述】:

我正在尝试实现一个根据整数值改变颜色的单元渲染器。但是,单元格的颜色仅在聚焦时才会发生变化。见下图。

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

    switch (column) {
        case 1:this.setFont(this.getFont().deriveFont(Font.BOLD)); break;
        case 3:this.setFont(this.getFont().deriveFont(Font.BOLD)); break;
    }
    if (column == 4 && (Integer)value > 0) {
        setForeground(Color.green);
    } else {
        setForeground(Color.red); 
    }
    return this;
}

【问题讨论】:

标签: java swing jtable cellrenderer


【解决方案1】:

我猜你的表格没有触发正确的更新事件,所以没有重绘单元格。

包含所有给定代码但无法重现问题的 MRE:

import java.awt.*;
import javax.swing.*;

class Code extends javax.swing.table.DefaultTableCellRenderer {
    public static void main(String[] args) throws Throwable {
        java.awt.EventQueue.invokeLater(Code::go);
    }
    private static void go() {
        JTable table = new JTable(
            new Object[][] {  { 0, 1, 2, 3, 4 }, { 1, 2, 3, 4, 5 } },
            new Object[] { "0", "1", "2", "3", "3" }
        );
        table.setDefaultRenderer​(Object.class, new Code());
        JFrame frame = new JFrame("Table");
        frame.add(table);
        frame.pack();
        frame.setVisible(true);

        new Timer(1000, event -> {
            table.setValueAt(
                -(Integer)table.getValueAt(0, 4),
                0, 4
            );
        }).start();
    }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        switch (column) {
            case 1:this.setFont(this.getFont().deriveFont(Font.BOLD)); break;
            case 3:this.setFont(this.getFont().deriveFont(Font.BOLD)); break;
        }
        if (column == 4 && (Integer)value > 0) {
            setForeground(Color.green);
        } else {
            setForeground(Color.red); 
        }
        return this;
    }
}

【讨论】:

  • 已解决,谢谢。我意识到我在此之上调用了另一个单元格渲染器,它交替行背景颜色,当我删除它工作的那部分时。
猜你喜欢
  • 1970-01-01
  • 2020-08-19
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 2014-06-18
  • 1970-01-01
相关资源
最近更新 更多