如何根据细胞的值为jtable的细胞着色

时间:2016-07-25 18:21:57

标签: java swing user-interface jtable tablecellrenderer

我想为jtable的某些特定单元格着色。这是我的渲染类。我把sysout放在if块上。打印所有字符串,但细胞的颜色除了其中一个外没有变化。

public class MyRenderer extends DefaultTableCellRenderer {
    static double rpmMin, rpmMax, speedMin, speedMax, temperatureMin, temperatureMax, voltageMin, voltageMax;


  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int column) {
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    if (!table.isRowSelected(row)) {
        if (column == 2 && Double.parseDouble(value.toString()) > rpmMin
                && Double.parseDouble(value.toString()) < rpmMax) {
            c.setBackground(Color.PINK);
        }
        if(column == 3 && Double.parseDouble(value.toString()) > speedMin
                && Double.parseDouble(value.toString()) < speedMax){
            c.setBackground(Color.PINK);
        }
        if (column == 4 && Double.parseDouble(value.toString()) > temperatureMin
                && Double.parseDouble(value.toString()) < temperatureMax) {
            c.setBackground(Color.PINK);
        }
        if(column == 5 && Double.parseDouble(value.toString()) > voltageMin
                && Double.parseDouble(value.toString()) < voltageMax){
            c.setBackground(Color.PINK);
        }
        else {
            c.setBackground(Color.GREEN);
        }
    }

    return c;
  }
}

Here is the output of my program. Only the first unsuitable value is colored pink.

我准备了一个excel来显示正确的输出。Here is the picture that I expected to see as output of this program

我不知道为什么它不起作用。有人可以向我解释一下吗?非常感谢:)

2 个答案:

答案 0 :(得分:3)

逻辑陷阱。你个人的ifs工作得很好,只是你的最后一个if是if / else语句会把所有东西都变成绿色,除非它适合粉红色。

基本上,前4个if语句被忽略,因为只有最后一个判断它是绿色还是粉红色。

此外,出于理智目的,解析一次,重复使用两次或更多次。

    Double val = Double.parseDouble(value.toString());

    if (column == 2 && val > rpmMin
            && val < rpmMax) {
        c.setBackground(Color.PINK);
    }
    else if(column == 3 && val > speedMin
            && val < speedMax){
        c.setBackground(Color.PINK);
    }
    else if (column == 4 && val > temperatureMin
            && val < temperatureMax) {
        c.setBackground(Color.PINK);
    }
    else if(column == 5 && val > voltageMin
            && val < voltageMax){
        c.setBackground(Color.PINK);
    }
    else {
        c.setBackground(Color.GREEN);
    }

答案 1 :(得分:1)

或类似的东西(不编译,请原谅粗糙):

int [][] minMaxes = { {0, 0},
                      {0, 0},
                      {rpmMin, rpmMax},
                      {speedMin, speedMax},
                      {temperatureMin, temperatureMax},
                      {voltageMin, voltageMax}
                    };
Color bgColor;
if (val > minMaxes[column][0] && val < minMaxes[column][1])
{
  bgColor = PINK;
}
else
{
  bgColor = GREEN;
}
c.setBackGround(bgColor);

适当检查列的值等

编辑

为了防止错误导致日期和时间字符串,我在代码中添加了一个if块,并且它工作得很好。这是 getTableCellRendererComponent 方法。

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int column) {
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    double [][] minMaxes = { {0, 0},
            {0, 0},
            {rpmMin, rpmMax},
            {speedMin, speedMax},
            {temperatureMin, temperatureMax},
            {voltageMin, voltageMax}
          };
    if (!table.isRowSelected(row)) {
        if(column == 0 || column == 1){
            c.setBackground(Color.WHITE);
        }
        else if (Double.parseDouble(value.toString())>minMaxes[column][0] && Double.parseDouble(value.toString())<minMaxes[column][1]) {
            c.setBackground(Color.PINK);
        }
        else {
            c.setBackground(Color.GREEN);
        }
    }

    return c;
}