TableCellRenderer使用来自另一个单元格的数据

时间:2014-01-10 14:58:24

标签: java swing jtable tablecellrenderer

我有jTable1有2列。我想控制第1列的外观,所以我使用下面的代码在单元格粗体中设置文本字体,或者根据单元格行是偶数还是奇数来设置。

import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class CustomTableCellRenderer extends DefaultTableCellRenderer{
@Override
public Component getTableCellRendererComponent (JTable table, Object obj,
        boolean isSelected, boolean hasFocus, int row, int column) {
    Component cell = super.getTableCellRendererComponent(
        table, obj, isSelected, hasFocus, row, column );
        if (row % 2 == 0){
            cell.setFont(getFont().deriveFont(Font.BOLD));
        }
        return cell;
    }
}

我用它来打电话:

jTable1.getColumnModel().getColumn(1).setCellRenderer(new 
CustomTableCellRenderer());

我想要的是修改此TableCellRenderer,以便根据同一行上的另一列(第0列)值绘制单元格背景。 例如,如果column0,第5行的值为“book”,则为column1,第5行将为红色,如果column0值为“newspaper”,则column1颜色为绿色。 我的问题是我不知道如何将column0值传递给column1渲染器,因此它将用于更改颜色。

3 个答案:

答案 0 :(得分:1)

检查.getTableCellRendererComponent(...)方法的签名:您将获得对JTable的引用(您可以从中获取TableModel),以及当前行和列的索引。

使用那些你可以查找你想要的任何相对值。

答案 1 :(得分:1)

如图here所示,您可以覆盖prepareRenderer()以影响整行。

答案 2 :(得分:1)

我找到了如何访问其他列数据:

import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class CustomTableCellRenderer extends DefaultTableCellRenderer{
@Override
public Component getTableCellRendererComponent (JTable table, Object obj,
    boolean isSelected, boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(
    table, obj, isSelected, hasFocus, row, column );

    //I USE THIS TO ACCESS THE DATA FROM ANOTHER CELL!!!
    TableModel model = table.getModel();
    String media= (String) model.getValueAt(row, 0)


    if (row % 2 == 0){
        cell.setFont(getFont().deriveFont(Font.BOLD));
    }


   //SO I GET THE RESULT I WANT
   if ("book".equals(media)){
     cell.setBackground(Color.red)  
   }
   else{
     cell.setBackground(Color.green)
   }  



    return cell;
}
}