Java 用于JTable颜色行的单元格渲染器

Java 用于JTable颜色行的单元格渲染器,java,swing,jtable,cellrenderer,Java,Swing,Jtable,Cellrenderer,我一直在寻找解决这个问题的方法,如果不问我自己的问题,我无法从不同的地方了解如何让我的桌子做彩色的排 从我看过的每个地方,我收集到我需要使用单元格渲染器,但问题是我不知道如何将其应用到我自己的情况 因此,我有一个简单的JTable,它有3列,我只想根据一个单独变量的值(不显示在表中)以绿色、黄色或红色突出显示每一行 看起来应该很简单,但我不知道怎么做。如果有帮助,我的表格定义如下: studentTableModel = new DefaultTableModel(new Object[]{"N

我一直在寻找解决这个问题的方法,如果不问我自己的问题,我无法从不同的地方了解如何让我的桌子做彩色的排

从我看过的每个地方,我收集到我需要使用单元格渲染器,但问题是我不知道如何将其应用到我自己的情况

因此,我有一个简单的JTable,它有3列,我只想根据一个单独变量的值(不显示在表中)以绿色、黄色或红色突出显示每一行

看起来应该很简单,但我不知道怎么做。如果有帮助,我的表格定义如下:

studentTableModel = new DefaultTableModel(new Object[]{"Name", "StudentNo", "Part"}, 0);
jt_studentTable = new JTable(studentTableModel);
jt_studentTable.getColumnModel().getColumn(2).setPreferredWidth(10);
studentTableModel.addRow(new Object[]{"(empty)", "(empty)", "(empty)"});
JScrollPane jsp_tableScroller = new JScrollPane(jt_studentTable);
jsp_tableScroller.setPreferredSize(new Dimension(200,190));
middleCentrePanel.add(jsp_tableScroller);
表中的行根据组合框的选择而变化

提前谢谢

我只是希望根据单独变量的值(不在表中显示)以绿色、黄色或红色突出显示每一行

渲染器处理表中的数据。也就是说,只有当组件拥有完成工作所需的所有信息时,它们才能自己绘制

因此,您需要以某种方式将信息添加到表中。这可以通过添加隐藏的第四列来完成。然后该表仍然可以访问所需的信息

那么也许你可以把这个建议用在其他方面

我只是希望根据单独变量的值(不在表中显示)以绿色、黄色或红色突出显示每一行

渲染器处理表中的数据。也就是说,只有当组件拥有完成工作所需的所有信息时,它们才能自己绘制

因此,您需要以某种方式将信息添加到表中。这可以通过添加隐藏的第四列来完成。然后该表仍然可以访问所需的信息


那么也许你可以使用中的建议。

也许这对你有用:

class MyCellRenderer extends DefaultTableCellRenderer {
     String separatedVariable;
     public MyCellRenderer(String separatedVariable) {
         this.separatedVariable = separatedVariable;
      }

      @Override
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
          Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
          c.setBackground(Color.WHITE);
          c.setForeground(Color.BLACK);
              JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
          if (separatedVariable.equals("YOUR VALUE TO GREEN")) {
              l.setBackground(Color.GREEN);

              return l;
          } else {
                     if (separatedValue.equals("YOUR VALUE TO YELLOW")) {
                          l.setBackground(Color.YELLOW);
                          return l;
                      } else if (separatedValue.equals("YOUR VALUE TO RED")) {
                          l.setBaground(Color.RED);
                          return l;
                      }
               }
              return c;
      }
}

也许这对你有用:

class MyCellRenderer extends DefaultTableCellRenderer {
     String separatedVariable;
     public MyCellRenderer(String separatedVariable) {
         this.separatedVariable = separatedVariable;
      }

      @Override
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
          Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
          c.setBackground(Color.WHITE);
          c.setForeground(Color.BLACK);
              JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
          if (separatedVariable.equals("YOUR VALUE TO GREEN")) {
              l.setBackground(Color.GREEN);

              return l;
          } else {
                     if (separatedValue.equals("YOUR VALUE TO YELLOW")) {
                          l.setBackground(Color.YELLOW);
                          return l;
                      } else if (separatedValue.equals("YOUR VALUE TO RED")) {
                          l.setBaground(Color.RED);
                          return l;
                      }
               }
              return c;
      }
}


我只是有同样的问题,但有点复杂,因为根据数据类型,我已经为每个列使用了几个不同的呈现器

但我发现这很有魅力:

public class MyTable extends JTable {
    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component result = super.prepareRenderer(renderer, row, column);

        if (mustBeYellow(row, column)) {
            result.setBackground(Color.yellow);
        }

        return result;
    }

    private boolean mustBeYellow(int row, int column) {
        // implement this depending on your data..
        return false;
    }
}

我只是有同样的问题,但有点复杂,因为根据数据类型,我已经为每个列使用了几个不同的呈现器

但我发现这很有魅力:

public class MyTable extends JTable {
    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component result = super.prepareRenderer(renderer, row, column);

        if (mustBeYellow(row, column)) {
            result.setBackground(Color.yellow);
        }

        return result;
    }

    private boolean mustBeYellow(int row, int column) {
        // implement this depending on your data..
        return false;
    }
}

这有助于您对单元格进行渲染。无关:Che,谢谢您链接到的答案有效-除此之外,它只会突出显示正在检查的单元格。你知道我将如何突出显示整行吗?删除我使用的条件,只需使用替代条件,如
if(row==0){use Color.Green;}否则{use Color.Yellow;}
。这将使用单一颜色高亮显示整行。但请使用约束检查行的颜色。这有助于您对单元格进行渲染。无关:Che,谢谢您链接到的答案有效-除此之外,它只会突出显示正在检查的单元格。你知道我将如何突出显示整行吗?删除我使用的条件,只需使用替代条件,如
if(row==0){use Color.Green;}否则{use Color.Yellow;}
。这将使用单一颜色高亮显示整行。但是使用一个约束来检查行应该如何着色。嘿,谢谢你的帮助,唯一的问题是解决方案只会更改它正在检查的一个单元格的颜色-我希望更改行中的所有单元格。你知道怎么做吗?你是如何设置单元格渲染器的?尝试如下设置:table.setCellRenderer(MyCellRenderer);嘿,谢谢你的帮助,唯一的问题是,解决方案只会改变它正在检查的一个单元格的颜色-我正在寻找改变行中所有单元格的颜色。你知道怎么做吗?你是如何设置单元格渲染器的?尝试如下设置:table.setCellRenderer(MyCellRenderer);