Java 更改JTable单元格前景色

Java 更改JTable单元格前景色,java,swing,jtable,Java,Swing,Jtable,我正在尝试更改JTable单元格的颜色(前景)。它正在工作,但它正在为单元格+1着色,而不是所需的单元格(正如您在我的代码中看到的) 我试图更改当前行和第3列的颜色,但实际上它正在更改下一列的颜色 此代码添加到自定义代码中 BaritemsTable = new javax.swing.JTable(){ @Override public Component prepareRenderer (TableCellRenderer renderer, int rowIndex , int colum

我正在尝试更改JTable单元格的颜色(前景)。它正在工作,但它正在为单元格+1着色,而不是所需的单元格(正如您在我的代码中看到的)

我试图更改当前行和第3列的颜色,但实际上它正在更改下一列的颜色

此代码添加到自定义代码中

BaritemsTable = new javax.swing.JTable(){
@Override
public Component prepareRenderer (TableCellRenderer renderer, int rowIndex , int columnIndex ){
    Component component = super.prepareRenderer(renderer , rowIndex , columnIndex );
    Object value = getModel().getValueAt(rowIndex , columnIndex);

    if (columnIndex == 3){

        if (value.equals("Ready")){
            BaritemsTable.setForeground(new java.awt.Color(51, 204, 0));
            BaritemsTable.setFont(new Font("Tahoma", Font.PLAIN, 48));
        }
        if (value.equals("Process")){
            BaritemsTable.setForeground(new java.awt.Color(51, 51, 255));
            BaritemsTable.setFont(new Font("Tahoma", Font.PLAIN, 48));
        }
        if (value.equals("Queued")){
            BaritemsTable.setForeground(new java.awt.Color(255, 0, 0));
            BaritemsTable.setFont(new Font("Tahoma", Font.PLAIN, 48));
        }

    } else {
        BaritemsTable.setForeground(new java.awt.Color(0, 0, 0));
        BaritemsTable.setFont(new Font("Tahoma", Font.PLAIN, 48));
    }
    return component;
  }
};

代码中的问题之一肯定是:

Object value = getModel().getValueAt(rowIndex , columnIndex);
在JTable的处理程序和侦听器、方法等中接收的索引是视图索引,只能用于索引视图。换句话说,你应该写:

Object value = getValueAt(rowIndex , columnIndex); // Use JTable.getValueAt

第二个问题:在prepareRenderer中直接引用列索引时,应该在该位置使用视图索引。你很可能需要

if (convertColumnIndexToModel(columnIndex) == 3)
JTable.convertColumnIndexToModel
确保使用模型中的索引。为什么需要这些,什么是视图索引和模型索引?它们之间有什么关系?我再解释一下


第三个问题:如果要为行/单元格设置颜色和字体,则需要在从
super.prepareRenderer
返回的组件上设置它们,而不是在表上。例如:

if (value.equals("Ready")){
    component.setForeground(new java.awt.Color(51, 204, 0));
    component.setFont(new Font("Tahoma", Font.PLAIN, 48));
}

索引总是从0开始,所以第3列的列索引是2而不是3(我从索引01开始)看起来像是a的作业。2) 要获得更好的帮助,请发布一个。3) 请学习常见的Java命名法(命名约定-例如,
EachWordUpperCaseClass
firstWordLowerCaseMethod()
firstWordLowerCaseAttribute
,除非它是一个
大写常量
),并一致地使用它。我从索引0开始,我已经将代码更改为您的建议对象value=getValueAt(rowIndex,columnIndex);没有效果!!!除了列出的问题,我没有看得更远(我这样做是为了从工作中快速休息)。我列出的绝对合法。但是您正在尝试使用
BaritemsTable.setForeground
设置颜色,但实际情况并非如此。您应该在组件上设置这些属性,而不是在表上。我将更新我的答案。我这样做了,但我得到一个错误非静态方法setForeground color不能从静态上下文引用@NeedHelpJava我看不出你做了什么,但我可以告诉你,你没有正确地应用我概述的内容。在我的回答中没有静态上下文。很高兴听到@NeedHelpJava。请花点时间勾选复选标记接受我的答案(✔) 在它旁边。请在此处阅读有关此礼仪的更多信息: