Java 如何从默认jtable更改特定行中的前景色

Java 如何从默认jtable更改特定行中的前景色,java,swing,jtable,Java,Swing,Jtable,我的应用程序中有一个默认jtable。我想做一些检查,并更改第一列等于close的所有行的颜色 我一直在努力做到这一点,我们得到的最多的是: String x = jTable.getModel().getValueAt(0, 0).toString(); if(x.equals("close")) { jTable.setForeground(Color.red); } 但我这样做了,改变了所有线条的颜色。并且只检查表的第一个元素 我喜欢做所有的检查行

我的应用程序中有一个默认jtable。我想做一些检查,并更改第一列等于close的所有行的颜色

我一直在努力做到这一点,我们得到的最多的是:

 String x =  jTable.getModel().getValueAt(0, 0).toString();

    if(x.equals("close")) 
 {
     jTable.setForeground(Color.red);
      }
但我这样做了,改变了所有线条的颜色。并且只检查表的第一个元素

我喜欢做所有的检查行,只改变那些第一列等于close的行

有人能帮我吗

谢谢你能给我的一切帮助


您好。

您必须实施一个新的解决方案。查看oracle的JTabel教程。

您需要使用
TableCellRenderer
。这个组件就像一个橡皮图章,可以在需要时在表格上移动并绘制单元格,这与Swing中的普通组件不同,Swing中的普通组件在一个位置具有较长的使用寿命

public Component getTableCellRendererComponent(JTable table,
    Object value,
    boolean isSelected,
    boolean hasFocus, 
    int row, int column) 
{
 Component cell = super.getTableCellRendererComponent(table, value, isSelected,
        hasFocus, row, column);
 String str = combo.getSelectedItem().toString();
 if (value.toString().equalsIgnoreCase(str))
 {
    cell.setBackground(Color.RED);
 }
 else
 {
    cell.setBackground(null);
 }

 return cell;
}
这里有一个例子,你可以用在你的桌子上

class MyTableCellRenderer extends JLabel implements TableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if (table.getModel().getValueAt(row, 0).equals("close")) {
            setForeground(Color.RED);
        } else {
            setForeground(Color.BLACK);
        }
        setText(String.valueOf(value));
        return this;
    }
}

public JTableFrame() {
    JTable table = new JTable();
    // Give your table some data:
    // table.setModel(new BlahTableModel());

    // Install the renderer on all columns
    MyTableCellRenderer renderer = new MyTableCellRenderer();
    table.getColumnModel().getColumn(0).setCellRenderer(renderer);
    table.getColumnModel().getColumn(1).setCellRenderer(renderer);


    getContentPane().add(BorderLayout.CENTER, new JScrollPane(table));
}

查看哪一个比使用自定义渲染器更简单,因为您不需要为表中的每种数据类型创建自定义渲染器。

阅读一些关于JTable的基础知识,特别是关于渲染的知识如何?在完成基本阅读后,在这个网站上搜索类似的QA,实际上有数千个…可能是重复的感谢回复,我会检查你给我的链接。抱歉。通常情况下,您不会从头开始实现TableCellRenderer(您会错过所有必要的配置,如selected、dnd…),尤其是当您实现与DefaultXX相同的错误(扩展组件与使用组件)时,最好在调用super之前进行自定义颜色设置(以避免臭名昭著的DTCR颜色内存)请注意,链接只回答…:)和往常一样,当您建议您的变体时:为应用程序需求子类化JTable(或任何其他JSomething)是邪恶的-如果您有某种插件机制支持可配置的可视装饰,那么重写prepareRenderer是一个很好的解决方案。
class MyTableCellRenderer extends JLabel implements TableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if (table.getModel().getValueAt(row, 0).equals("close")) {
            setForeground(Color.RED);
        } else {
            setForeground(Color.BLACK);
        }
        setText(String.valueOf(value));
        return this;
    }
}

public JTableFrame() {
    JTable table = new JTable();
    // Give your table some data:
    // table.setModel(new BlahTableModel());

    // Install the renderer on all columns
    MyTableCellRenderer renderer = new MyTableCellRenderer();
    table.getColumnModel().getColumn(0).setCellRenderer(renderer);
    table.getColumnModel().getColumn(1).setCellRenderer(renderer);


    getContentPane().add(BorderLayout.CENTER, new JScrollPane(table));
}